C语言中||和&&能同时出现在一条语句中吗?

1、正文

C语言中与和或同时写在一条语句中会出现问题吗?
答案是:会,而且很严重!
验证为什么不能请花5分钟细看
(凌晨了还在码字,有些飘忽,如有错误欢迎指出)

1.1、问题

定义三个整形变量 int a,b,c,并对三个变量随便赋值,若a,b,c都<=3且>=1,则输出“通过”,若出现一个或多个不满足则输出“不通过”

2、&&和||优先级与其他运算符优先级

运算符优先级(从高到低列出)

运算符描述
. [] ()字段访问、数组下标、函数调用以及表达式分组
++ -- - ~ ! delete new typeof void一元运算符、返回数据类型、对象创建、未定义值
* / %乘法、除法、取模
+ - +加法、减法、字符串连接
<< >> >>>移位
< <= > >= instanceof小于、小于等于、大于、大于等于、instanceof
== != === !==等于、不等于、严格相等、非严格相等
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
?:条件
= oP=赋值、运算赋值
,多重求值

3、0&&1和0||1等于啥?

举个例子来验证一下这些
0&&1=0
0 || 1=1
0&&0=0
1 || 1=1
1&&1=1
0 || 0=0

#include<stdio.h>
int main()
{
int a;
a=(0&&1);
printf("0&&1=%d\n",a);
a=(0||1);
printf("0||1=%d\n",a);
a=(0&&0);
printf("0&&0=%d\n",a);
a=(1||1);
printf("1||1=%d\n",a);
a=(1&&1);
printf("1&&1=%d\n",a);
a=(0||0);
printf("0||0=%d\n",a);
return 0;
}



得出

0&&1=0
0||1=1
0&&0=0
1||1=1
1&&1=1
0||0=0

4、详解

有了上面的铺垫可以开始推导
问题:定义三个整形变量 int a,b,c,并对三个变量随便赋值,若a,b,c都<=3且>=1,则输出“通过!”,若出现一个或多个不满足则输出“不通过!”
最简单可以把代码可以写为

#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==1||a==2||a==3&&b==1||b==2||b==3&&c==1||c==2||c==3)
printf("通过!\n");
else
printf("没通过!\n");
return 0;
}

4.1、举例为啥不能

如下详细介绍

4.2、给a,b,c赋值

给a,b,c赋1~3的值我们看到都是通过的!
在这里插入图片描述
给a,b,c赋大于3的值

为什么呢?我们在上面讲过优先级和0&&1和0||1的举例通过举例可以得出
结论

主要看这条语句(主要讨论的问题,一条语句中是否同时能出现||和&&)

if(a==1||a==2||a==3&&b==1||b==2||b==3&&c==1||c==2||c==3)

4.3、输入a=1 ,b=2,c=3系统如何处理

if(a==1||a==2||a==3&&b==1||b==2||b==3&&c==1||c==2||c==3)
//这条语句是初始语句,把a,b,c带入进去后
if(1||0||0&&0||1||0&&0||0||1)
//根据优先级先算==(若等为1,反知为0)
if(1||0||0||1||0||0||1)
//&&的优先级大于||,所以根据上面得出0&&0=0
if(1||0||1||0||0||1)
if(1||1||0||0||1)
if(1||0||0||1)
if(1||0||1)
if(1||1)
if(1)
//根据之前验证1||0=1,1||1=1

4.4、输入a=1 ,b=2,c=4系统如何处理

if(a==1||a==2||a==3&&b==1||b==2||b==3&&c==1||c==2||c==3)
//这条语句是初始语句
if(1==1||1==2||1==3&&b==2||b==2||b==2&&c==4||c==4||c==4)
//把a=1,b=2,c=4带入进去后
if(1||0||0&&0||1||0&&0||0||0)
//根据优先级先算==(若等为1,反知为0)
if(1||0||0||1||0||0||0)
//&&的优先级大于||,所以根据上面得出0&&0=0
if(1||0||1||0||0||0)
if(1||1||0||0||0)
if(1||0||0||0)
if(1||0||0)
if(1||0)
if(1)
//根据之前验证1||0=1,1||1=1

输入a=10 ,b=1,c=1系统如何处理

if(a==1||a==2||a==3&&b==1||b==2||b==3&&c==1||c==2||c==3)
//这条语句是初始语句
if(10==1||10==2||10==3&&1==1||1==2||1==3&&c==1||1==2||1==3)
//把a=10,b=1,c=1带入进去
if(0||0||0&&1||0||0&&1||0||0)
//根据优先级先算==(若等为1,反知为0)
if(0||0||0||0||0||0||0)
//根据之前验算0&1=0
if(0)
//0||0=0

if(0)则为假,假则执行else
if(1)则为真,真则忽略else

4.5、总结

今天写代码出现了问题研究了好几个小时,到处看资料也没有想要的答案网上没有人说过这个问题,不过我还是遇到了,虽然这种问题绕个弯多些几条if else就可避免,不过还是提一下。

  • 28
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanglx(汤龙祥)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值