雑記
ああ勘違い
最終更新:
匿名ユーザー
-
view
けっこう、初心者から年季の入った人でも勘違いしている人が多いんじゃないかネタ。
【インクリメント・デクリメント演算子】
①CPUのアトミックな命令だと思っている
→命令を実装していないCPUもあります。
またintなど処理系にとって自然な型のみの実装という
場合もあります
①CPUのアトミックな命令だと思っている
→命令を実装していないCPUもあります。
またintなど処理系にとって自然な型のみの実装という
場合もあります
②必ず1足されると思っている
→ポインタの場合は型のサイズ分進みます。
したがってアドレス+1ではありません。
→ポインタの場合は型のサイズ分進みます。
したがってアドレス+1ではありません。
【switch-case文】
①最適化でかならずジャンプテーブルにしてくれると
思っている
→コンパイラに依存します。また、対応したコンパイラでも
この変換を行うのは評価する対象(caseの後に書く条件)
が等差数列かつdefaultが無いときのみです。
②上から順に評価されると思っている
→ほとんどの処理系では条件の小さいほうからの評価に
置き換えられます。
したがって明示的に評価順を決めたい場合には
if~else ifを使う必要があります。
①最適化でかならずジャンプテーブルにしてくれると
思っている
→コンパイラに依存します。また、対応したコンパイラでも
この変換を行うのは評価する対象(caseの後に書く条件)
が等差数列かつdefaultが無いときのみです。
②上から順に評価されると思っている
→ほとんどの処理系では条件の小さいほうからの評価に
置き換えられます。
したがって明示的に評価順を決めたい場合には
if~else ifを使う必要があります。
【strlen】
○必要領域のレングスを返してくれると思っている
→NULL文字の前までの文字数を返します。したがって、
一般的な文字列として格納したい場合には+1の領域が
必要です。
文字列リテラルであれば、NULLも含めたレングスは
sizeof演算子で取得できます。
したがって
strlen("Hello World\n") != sizeof("Hello World\n")
です。
○必要領域のレングスを返してくれると思っている
→NULL文字の前までの文字数を返します。したがって、
一般的な文字列として格納したい場合には+1の領域が
必要です。
文字列リテラルであれば、NULLも含めたレングスは
sizeof演算子で取得できます。
したがって
strlen("Hello World\n") != sizeof("Hello World\n")
です。
【sizeof】
○サイズ取得関数だと思っている
→演算子です
配列をexternする際は要素数をextern宣言で書いて
おかないとsizeofでサイズが正しく取得できません
(ほとんどの場合ポインタと同じサイズが返ります)
○サイズ取得関数だと思っている
→演算子です
配列をexternする際は要素数をextern宣言で書いて
おかないとsizeofでサイズが正しく取得できません
(ほとんどの場合ポインタと同じサイズが返ります)
※時々見る勘違い(もちろんバグ)
sizeof("Hello World\n")
は14だが、
char *hoge = "Hello World\n"; sizeof(hoge);
はポインタのサイズ(32bit環境なら4)
他にもあるけど、とりあえず今思いついた分。