C语言,连续使用(与运算和或运算)&&与||时的注意事项

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

  • 19
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值