© 2005 Martin J. Dürst 青山学院大学
-
, ++
,
--
,...+
, -
, *
,
/
, %
, [],...?:
()
:
関数、キャスト、演算のまとめ、if
文など,
: 引数の区切り、順序演算-
: 単項引き算 (付録 2.1
に追加)、二項引き算+
: 単項 ((型変換以外) 効果なし; 付録 2.1
に追加)*
: 掛け算、ポインタ&
: ビット積、ポインタ式に括弧がないところは演算子の優先度 (priority) の高いものから計算される
各演算子の優先度は付録 2.1 に参照
順序は一般的に括弧を少なめに使ってもいいようにできている
for (i=0; i<max-1 && (c=getchar()) != '\n' && c !=
EOF; ++i)
== と != は <, >, <=, >= より優先度が低い
if (a1 < a2 == b1 < b2)
但し、はまるところもある
c = a<<8 + b /* a << (8+b) ! */
C の殆どの演算子は左から右に連結する
右から左に連結するのは次の演算子である:
++
と --
以外の単項演算子連結規則 (assoicativity) が数学的に影響がないときにもプログラムの結果に影響がある時がある
i = 4 * 5 / 3; /* integer division */
||
、 &&
と ?:
以外には全式のすべての部分が評価される
x != 0 && y / x > 20
x = 0 * func(y)
chars = printf("日") + printf("本")
a[i] = i++;
単純な置き換え:
#define ARRAYSIZE 20
関数型マクロ (優先度のための括弧に注意):
#define MAX(A,B) ((A)>(B)?(A):(B))
型に関係ないので便利; しかし副作用に注意:
→
MAX(getchar(),x)((getchar())>(x)?(getchar()):(x))
文字列化の機能:
#define PRI(i) (printf(#i " = %d\n", (i)))
→
PRI(a+b)(printf("a+b" " = %d\n", (a+b)))
#define
を使ってみるIBM 大型計算機以外現在ほとんどの処理系は ASCII コードを使う
%d
の代りに %x
か %X
)
が分かりやすいかも