**********************************************
#include
//マクロ1 括弧なし
#define MAX(i, j) i > j ? i : j
//マクロ2 括弧あり
#define MAX(i, j) ((i) > (j)) ? (i) : (j)
int main(void)
{
printf("%d\n", MAX(1, 2));
printf("%d\n", MAX(1, -1));
/********/
printf("%d\n", MAX(100 && -1, 0));
return 0;
}
**********************************************
MAXを定義しているマクロ1かマクロ2のどちらかのみを有効にして
実行してみる。
3つ目のprintf()で表示される値が
マクロ1にした場合、0が表示される。
マクロ2にした場合、1が表示される。
どうしてそうなるのか一人で考えていても確信が持てなかったので
Cでの仕事に長い人(K先生)に聞いてみた。
私:3つ目のprintf()で表示されるのが1なのは
(100 && -1) の結果が1になるから?
&&演算子で比較する値はゼロ以外は真として比較されるの?
先生教えてプリーズ。
K先生:ご名答!
真偽値は、ゼロが偽、それ以外は負の値でも真。
(100 && -1) は (真 && 真) って事で、結果は真。
で、真の代表値として1が使われたんだと思う。
でも、真偽値を整数として扱うことは、コンパイラに
よって動きが違うかもしれないので要注意。
コレは1だったけどね。
ということ。
むぅ~、なるほどぉー。
人に聞いてみてYES言ってもらえると、なんだか自信がついて嬉しかた。
慣れた人には「チョット考えればわかるでしょ」的な内容かもしれないけど
独学中のmeにとっては理解に自信が持てなかった。
K先生ありがとー。またよろしくー (´д`)ノ
#include
//マクロ1 括弧なし
#define MAX(i, j) i > j ? i : j
//マクロ2 括弧あり
#define MAX(i, j) ((i) > (j)) ? (i) : (j)
int main(void)
{
printf("%d\n", MAX(1, 2));
printf("%d\n", MAX(1, -1));
/********/
printf("%d\n", MAX(100 && -1, 0));
return 0;
}
**********************************************
MAXを定義しているマクロ1かマクロ2のどちらかのみを有効にして
実行してみる。
3つ目のprintf()で表示される値が
マクロ1にした場合、0が表示される。
マクロ2にした場合、1が表示される。
どうしてそうなるのか一人で考えていても確信が持てなかったので
Cでの仕事に長い人(K先生)に聞いてみた。
私:3つ目のprintf()で表示されるのが1なのは
(100 && -1) の結果が1になるから?
&&演算子で比較する値はゼロ以外は真として比較されるの?
先生教えてプリーズ。
K先生:ご名答!
真偽値は、ゼロが偽、それ以外は負の値でも真。
(100 && -1) は (真 && 真) って事で、結果は真。
で、真の代表値として1が使われたんだと思う。
でも、真偽値を整数として扱うことは、コンパイラに
よって動きが違うかもしれないので要注意。
コレは1だったけどね。
ということ。
むぅ~、なるほどぉー。
人に聞いてみてYES言ってもらえると、なんだか自信がついて嬉しかた。
慣れた人には「チョット考えればわかるでしょ」的な内容かもしれないけど
独学中のmeにとっては理解に自信が持てなかった。
K先生ありがとー。またよろしくー (´д`)ノ