プログラミング言語C – 論理積、コンマ演算子
津路です。
引き続き、プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
付録A 参照マニュアルの以下のページを取り上げます。
A7.14 論理的AND演算子
今回は、論理積から取り上げます。
条件文において、良く使う、&&演算子ですが、被演算子の型が違っても良いそうです。
ですが、算術型かあるいはポインタでなければならない。とあります。
ポインタであれば、例えば、ポインタの指す領域の存在を確認してから、中身を参照するとかに使えます。
1 2 3 4 5 6 | char ch[] = "ki"; char *p = ch; if((p) && *p=='k') { printf("top is k\n"); } |
ここで、結果の型はintですが、Microsoft docsを参照すると、boolだそうです。
A7.18 コンマ演算子
次に、コンマ演算子です。
関数呼び出しの中でよく使われます。 f(0, a, b) とか。
書籍では、f(a, (t=3, t+2), c) という例があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int f(int a, int b, int c); int main() { int a=0, t=0, c=5; f(a, (t=3,t+6), c); printf("end\n"); return 0; } int f(int a, int b, int c) { printf("a:%d, b:%d, c:%d\n",a,b,c); } |
また、ANSI C言語辞典という書籍では、条件演算子を使ったこんな例もあります。
int a=10;
f(a, a>0 ? t=4,t+3 : 77, c); これは、a > 0 ならば 7が、0以下ならば 77 が投入されるということです。
1 2 3 4 | a=0; f(a, a > 0 ? t=4,t+3 : 77, c); a=10; f(a, a > 0 ? t=4,t+3 : 77, c); |
変数初期化やprintfの例もあり、面白いです。
printf(“%s\n”,(“a”,”b”,”c”)); では、「c」が表示されます。
親切に形式が書いてあって、op1,op2, …. ここで、op1は順次式, op2は代入式
結果の値は、op2の値。
Wikipediaからコンマ演算子の初期化式サンプルを引いて、編集してコンパイル実行すると、
1 2 3 4 5 6 7 8 9 | int i,b; a=3, b=4; c=5; i = a, b; //これは、紛らわしいので私は使いません printf("i:%d\n",i); //3 i = (a += 2, a + b); // aに2を加算した後、a+b をiへ代入する printf("i:%d\n",i); //9 i = a += 2, a + b; // aに2を加算した後、aの値をiへ代入する printf("i:%d\n",i); //7 i = (a, b, c); printf("i:%d\n",i); //5 |