c语言编译连续加法运算,C语言,连续使用(与运算和或运算)&&与||时的注意事项...

#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;

}

运行结果如下:

da88fa83188e767abd20ddf73313342f.png

根据运行结果可以看出

由(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)将左边的式子自动添加上括号,以保证优先级的一致性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值