#includeint main(void){
int a, b, c ;
A:printf("a b c\n");
scanf("%d %d %d",&a,&b,&c);
if(a || b && c)
printf("( %d || %d && %d ) = OK!\n",a,b,c);
else
printf("( %d || %d && %d ) = Error!\n",a,b,c);
getchar();
printf("############\n");
goto A;
return 0;
}
运行结果如下:
根据运行结果可以看出
由(0 || 0 && 1) =Error!,假设 (0 || 0 && 1) == { 0 || ( 0 && 1) } ,先运行(0 && 1) ,结果为假( 0 ),{ 0 || 0 } = 0;
若上面假设为真,利用假设来算 (0 || 1 && 0 ) 的结果,若计算结果与运行结果相同,则假设为真 ,反之为假。
运算:(0 || 1 && 0) == { 0 || ( 1 && 0 ) }=={ 0 || ( 0 ) }==Error!
结果相同,假设正确;
再次检验 :(1 || 1 && 0) == { 1 || ( 1 && 0) } == { 1 || 0 } ==OK! ,与运行结果相同。
结论:
&& 优先级比 || 优先级高 ,同一优先级从左往右计算。
如计算 : ( 1 && 0 || 0 || 1 && 1 || 0 && 1 || 1) 时
=={ (1 && 0 ) || 0 || ( 1 && 1 ) || ( 0 && 1 ) || 1}//优先级处理
== { 0 || 0 || 1 || 0 || 1 }//高优先级计算结束
=={ ( 0 || 0 ) || 1 || 0 || 1 } //从左往右计算,依次
=={ ( 0 || 1 ) 0 || 1 }
=={ ( 1 || 0 ) || 1 }
=={ 1 || 1 }
==1
补充问题:a =0,b=0,c=0;c=++a||a++&&++b结果的判定?
解决:按照上面的结论,问题等价于:c=++a||(a++&&++b)
按照优先级,a=2,b=2,c=1,错误!!!
错误原因:||的左边只有一个式子,右边一串式子时,编译器并不是按照++a||(a++&&++b)的等价方式处理,而是安如下方式:
(++a)||(a++&&++b)将左边的式子自动添加上括号,以保证优先级的一致性