大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

プログラミング言語C – 論理積、コンマ演算子

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2019/03/12
最終更新日:2019/03/12
カテゴリー:技術情報
タグ:

津路です。
引き続き、プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
付録A 参照マニュアルの以下のページを取り上げます。
A7.14 論理的AND演算子

今回は、論理積から取り上げます。
条件文において、良く使う、&&演算子ですが、被演算子の型が違っても良いそうです。
ですが、算術型かあるいはポインタでなければならない。とあります。
ポインタであれば、例えば、ポインタの指す領域の存在を確認してから、中身を参照するとかに使えます。

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) という例があります。

#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 が投入されるということです。

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からコンマ演算子の初期化式サンプルを引いて、編集してコンパイル実行すると、

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
    上に戻る