标签:
关于a=0和a==0的解释:
如果:int a = 0;
那么a=0这个表达式是假,a==0这个表达式为真。
如果:int a = 1;
那么a=0这个表达式是假,a==0这个表达式为假。
举个例子:
int a = 0; if( a = 0 ) printf( "True" ); else printf( "False" );输出:False.
<span style="font-size:18px;"> </span><span style="font-size:10px;">int a = 0; if( a == 0 ) printf( "True" ); else printf( "False" );</span>输出:True.
int a = 1; if( a == 0 ) printf( "True" ); else printf( "False" );输出:False
int a = 0; if( a = 1 ) printf( "True" ); else printf( "False" );输出:True
int main() { int a,b,c; a=b=c=0; (1>0?a==0:0>1)?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0; }输出结果是:010.
int main() { int a,b,c; a=b=c=0; (1>0?a=0:0>1)?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0; }输出结果则是:001
int main() { int a,b,c; a=b=c=0; 1>0?a++:(0>1?b++:c++); printf( "%d%d%d\n", a, b, c ); return 0; }输出结果是:100.很奇怪的是b和c的值都没有改变。在C语言中,条件表达式?:的结合性是右结合的(就是从右往左结合)。也就是说跟下面这个程序一样:
int main() { int a,b,c; a=b=c=0; 1>0?a++:0>1?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0; }去掉了括号。输出结果经过验证确实是一样的:100。
那么,这个括号()的优先级是比条件表达式的优先级高很多的。所以应该先计算(0>1?b++:c++)这个吧?不是吗?
如果是,那么0>1为假,则执行c++,所以c=1;
如果不是,那么先把后面那个括号(0>1?b++:c++)当做是前面?:语句的一个子项。那么就是先判断1>0为真,所以执行a++,a=1;答案输出100.正确!
到底是不是这样子的呢??我们再来验证:
int main() { int a,b,c; a=b=c=0; 0>1?a++:(0>1?b++:c++); printf( "%d%d%d\n", a, b, c ); return 0; }输出结果是:001.分析一下,先判断0>1为假,所以执行(0>1?b++:c++),判断,0>1为假所以执行c++,c=1;输出001,所以验证了假说。
目前应该是这样的。
再看一个例子:
int main() { int a,b,c; a=b=c=0; 0>1?a++:0>1?b++:c++?1>0?b++:c++:a++; printf( "%d%d%d\n", a, b, c ); return 0; }
C Language Study - a=0 and a==0
标签:
原文地址:http://blog.csdn.net/oimchuan/article/details/44959135