わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Cの勘違い

  • sizeofはライブラリ関数
  • sizeofは関数形式マクロで定義できる*1
  • 構造体を,==や!=で比較できる
  • 構造体の代入ができるようになったのはC99から
  • 配列とポインタは互換可能
  • [ ]演算子を使えるのは配列,*演算子を使えるのはポインタに限られる
  • [ ]演算子よりも*演算子を使うほうが,処理時間は短い
  • 関数呼び出しで配列を渡せば,(関数の中でその配列の)サイズを知ることができる
  • constなしのポインタから,constありのポインタへの代入はできない*2
  • 初期化を伴う配列変数の宣言(定義)でサイズを書くときは,初期化の値の個数も同じでなければならない
  • 関数呼び出しで引数の間に書く「,」はコンマ演算子
  • '0'から'9'までの値が連続していると想定してはならない*3
  • a = ++b--; は a = b + 1; と同じ.前置インクリメント演算子により,aにはbの一つ次の値を代入し,bの値は結果として変わらない
  • a = ++b--; は a = b - 1; と同じ.後置デクリメント演算子のほうが優先順位が高いため,aにはbの一つ前の値を代入し,bの値は結果として変わらない

書いてから調査したところ,もっといいリンク集を見つけました: C言語の誤解されていそうなことについて

*1:構造体名(型名)とメンバ名を引数にとり,そのメンバが構造体オブジェクトの先頭から何バイト離れているか(オフセット)を求める,offsetofは,関数形式マクロにより定義可能です.http://www.linux.or.jp/JM/html/LDP_man-pages/man3/offsetof.3.html

*2:これができないとなると,例えばstrcpyを呼び出すとき,実引数側の第2引数もあらかじめconst char *にしておかないといけないということで,実用上大変なことになります.

*3:C言語によるプログラミング スーパーリファレンス編』p.28, JIS X 3010:2003 p.13