C语言,连续使用(与运算和或运算)&&与 | 您所在的位置:网站首页 › c语言的与或非逻辑 › C语言,连续使用(与运算和或运算)&&与 |
#include
int 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)将左边的式子自动添加上括号,以保证优先级的一致性 |
CopyRight 2018-2019 实验室设备网 版权所有 |