鱼C论坛

 找回密码
 立即注册
查看: 1003|回复: 6

[已解决]短路运算

[复制链接]
发表于 2020-3-30 10:57:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        char ch[6] = "FishC";
        int i;

        printf("请输入你想访问的字符序号(0~5):");
        scanf("%d", &i);

        if (!(i >= 0 && i <= 5 && printf("%c\n", ch[i])))
        {
                printf("非法访问!\n");
        }

        return 0;
}
请帮我解答一下第11行if的运算步骤,越详细越好,谢谢哈!
最佳答案
2020-3-30 11:35:02
本帖最后由 sunrise085 于 2020-3-30 18:01 编辑

所谓短路逻辑就是,同一优先级的多个部分进行逻辑运算的时候,从左向右开始运算,若前面的部分已经能够决定据俄国,则不再进行后面的运算,也就是说,与运算前面的结果为0或者或运算前面部分结果为1,都会对后面的进行短路。
!(i >= 0 && i <= 5 && printf("%c\n", ch[i]))
这个逻辑表达式,外层是非运算,所以先看括号内的结果,
然后会发现是三部分进行与运算,
这就涉及到短路逻辑了
先判断第一部分i>=0,若输入的i值小于0,那么该逻辑运算结果为0,则对后面的两部分短路,不再进行后两部分的运算,
若满足该条件,则判断第二部分i<=5,同样的道理,若输入的i值大于5,那么该逻辑运算结果为0,则对后面的运算短路,不再进行后面的运算,
若这两部分都符合条件,则判断第三部分printf,printf函数的返回值是程序打印出来字符的个数。这里会先执行这个prinf语句,然后再对其返回值进行判断,前两部分已经确定i值符合条件,字符数组没有赋值的单元为'\0',而'\0'以%c打印输出,则不会有显示,printf返回值为1(这个程序中%c后还有一个'\n',因此返回值为2),因此若输入的i=5,printf返回值为2,这样if条件的逻辑运算 !(1 && 1 && 2) 结果为0,不执行if语句块printf("非法访问!\n")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-30 11:35:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-30 18:01 编辑

所谓短路逻辑就是,同一优先级的多个部分进行逻辑运算的时候,从左向右开始运算,若前面的部分已经能够决定据俄国,则不再进行后面的运算,也就是说,与运算前面的结果为0或者或运算前面部分结果为1,都会对后面的进行短路。
!(i >= 0 && i <= 5 && printf("%c\n", ch[i]))
这个逻辑表达式,外层是非运算,所以先看括号内的结果,
然后会发现是三部分进行与运算,
这就涉及到短路逻辑了
先判断第一部分i>=0,若输入的i值小于0,那么该逻辑运算结果为0,则对后面的两部分短路,不再进行后两部分的运算,
若满足该条件,则判断第二部分i<=5,同样的道理,若输入的i值大于5,那么该逻辑运算结果为0,则对后面的运算短路,不再进行后面的运算,
若这两部分都符合条件,则判断第三部分printf,printf函数的返回值是程序打印出来字符的个数。这里会先执行这个prinf语句,然后再对其返回值进行判断,前两部分已经确定i值符合条件,字符数组没有赋值的单元为'\0',而'\0'以%c打印输出,则不会有显示,printf返回值为1(这个程序中%c后还有一个'\n',因此返回值为2),因此若输入的i=5,printf返回值为2,这样if条件的逻辑运算 !(1 && 1 && 2) 结果为0,不执行if语句块printf("非法访问!\n")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 16:31:30 | 显示全部楼层
sunrise085 发表于 2020-3-30 11:35
所谓短路逻辑就是,同一优先级的多个部分进行逻辑运算的时候,从左向右开始运算,若前面的部分已经能够决定 ...

请问这个程序的printf算做条件怎么还可以输出啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 16:35:28 | 显示全部楼层
Juniorboy 发表于 2020-3-30 16:31
请问这个程序的printf算做条件怎么还可以输出啊

先执行该语句,然后才能得到这个语句的返回值,再将该返回值作为条件中的逻辑判断项
执行了该语句,就会输出啊~
不执行,就不会有结果,也就不会有返回值的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 16:55:18 | 显示全部楼层
sunrise085 发表于 2020-3-30 16:35
先执行该语句,然后才能得到这个语句的返回值,再将该返回值作为条件中的逻辑判断项
执行了该语句,就会 ...

但是print是在if的判断的逻辑语句中啊,他只起到一个真假的作用,为什么我分别输入了12345会有输出呢,不应该是输入12345之后直接完事,输入的不是12345之后才执行if{}里的那个输出非法访问吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 17:58:17 | 显示全部楼层
Juniorboy 发表于 2020-3-30 16:55
但是print是在if的判断的逻辑语句中啊,他只起到一个真假的作用,为什么我分别输入了12345会有输出呢,不 ...

当你输入的是012345的时候,if判断条件的前两部分(i>=0和i<=5)都为真,
所以会对第三部分(printf("%c\n", ch[i]))进行判断,要进行判断就要先执行啊。
只有执行完后才能知道这个语句的真假啊
所以当你输入012345的时候,都会执行printf("%c\n", ch[i])将对应的字符打印输出。
此时printf执行的结果为2,因此if语句的条件为  !(1 && 1 && 2) 结果为0,不执行if语句块printf("非法访问!\n")

当输入i超出范围后,if条件的前两部分则判断为假,将第三部分短路,不执行printf("%c\n", ch[i]),if的条件结果为1,执行if语句块printf("非法访问!\n")

另外,我在二楼写的有一点问题,'\0'用printf打印,返回值是1,不是0 。 我一会儿修改一下


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 19:10:11 | 显示全部楼层
sunrise085 发表于 2020-3-30 17:58
当你输入的是012345的时候,if判断条件的前两部分(i>=0和i

啊啊啊,明白了,谢谢您哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表