鱼C论坛

 找回密码
 立即注册
查看: 1198|回复: 8

[已解决]当循环中的判断条件不止一条时, 不同的连接符号会有不同

[复制链接]
发表于 2020-8-24 22:17:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Hevay 于 2020-8-24 22:21 编辑

        下面的两段代码, 循环中的两个判断条件, 是用逗号分隔, 还是用短路与连接, 看起来应该是没有差别的, 且这两段简单的代码运行的结果是一样的.  但实际上其实是有区别的, 只不过我想请问下谁能说清楚其中的原理? 它们真正的差别到底是什么?
        int i, j, count = 1;
        for (i = 0, j = 9; i < 9, j > 0; i++, j--) {
                printf("第%d次打印, i = %d, j = %d\n", count++, i, j);
        }

        int i, j,  count = 1;
        for (i = 0,j = 9; i < 9 && j > 0; i++, j--) {
                printf("第%d次打印, i = %d, j = %d\n", count++, i, j);
        }
最佳答案
2020-8-24 23:23:36
Hevay 发表于 2020-8-24 22:40
并不相同, 经过实际测试, 我已经弄清楚了它们之间的差别, 两个判断条件用短路与连接时, 需要两个条件同时满 ...

你说的是对的,我试过将 i < 9 去掉,结果 i = 0, j = 9; j > 0; i++, j--  仍然与 i = 0, j = 9; i < 9, j > 0; i++, j-- 是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 22:31:09 | 显示全部楼层
“用逗号分隔, 还是用短路与连接”其实都是表示两个条件同时满足的意思,在循环条件这里好像差别不大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 22:40:52 | 显示全部楼层
本帖最后由 Hevay 于 2020-8-24 22:42 编辑

并不相同, 经过实际测试, 我已经弄清楚了它们之间的差别, 两个判断条件用短路与连接时, 需要两个条件同时满足, 循环才会继续.而如果用逗号分隔, 则判断条件会以最后一个条件为准.例如将第一段代码改为
        int i, j, count = 1;
        for (i = 0, j = 9; i < 9, j > 0; i++, j++) {
                printf("第%d次打印, i = %d, j = %d\n", count++, i, j);
        }
看似需要同时满足两个条件才能继续循环, 但其实这是个无限循环, 因为后一个条件永远满足.
如果是用短路与连接, 则是需要同时满足两个条件才能继续循环, 次数仍然是有限的. 有兴趣的朋友可以自己亲自测试下
int i, j, count = 1;
for (i = 0, j = 9; i < 9 && j > 0; i++, j++) {
                printf("第%d次打印, i = %d, j = %d\n", count++, i, j);
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 23:23:36 | 显示全部楼层    本楼为最佳答案   
Hevay 发表于 2020-8-24 22:40
并不相同, 经过实际测试, 我已经弄清楚了它们之间的差别, 两个判断条件用短路与连接时, 需要两个条件同时满 ...

你说的是对的,我试过将 i < 9 去掉,结果 i = 0, j = 9; j > 0; i++, j--  仍然与 i = 0, j = 9; i < 9, j > 0; i++, j-- 是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 02:08:12 | 显示全部楼层
本帖最后由 Darth_EF 于 2020-8-25 02:11 编辑

The C Programming Language 里面写的很清楚。
A.7.18 逗号运算符
表达式:
  赋值表达式
  表达式, 赋值表达式

由逗号分隔的两个表达式的求值次序为从左到右,并且左表达式的值被丢弃。右操作数的类
型和值就是结果的类型和值。在开始计算右操作数以前,将完成左操作数涉及到的副作用的
计算。在逗号有特别含义的上下文中,如在函数参数表(参见 A.7.3 节)和初值列表(A.8.7
节)中,需要使用赋值表达式作为语法单元,这样,逗号运算符仅出现在圆括号中。例如,
下列函数调用:
f(a, (t=3, t+2), c)
包含 3 个参数,其中第二个参数的值为 5。

A.7.14 逻辑与运算符
逻辑与表达式:
  按位或表达式
  逻辑与表达式&&按位或表达式
运算符&&遵循从左到右的结合性。如果两个操作数都不等于 0,则结果值为 1,否则结果值 0。
与运箅符&不同的是,&&确保从左到右的求值次序:首先计算第一个操作数,包括所有可能的
副作用;如果为 0,则整个表达式的值为 0;否则,计算右操作数,如果为 0,则整个表达式
的值为 0,否则为 1。
两个操作数不需要为同一类型,但是,每个操作数必须为算术类型或者指针。其结果为
int 类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-25 08:03:58 | 显示全部楼层
昨非 发表于 2020-8-24 22:31
“用逗号分隔, 还是用短路与连接”其实都是表示两个条件同时满足的意思,在循环条件这里好像差别不大

胡说,逗号表达式取最后一项的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 09:12:26 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-25 08:03
胡说,逗号表达式取最后一项的值。

从左到右以此计算,只取最后一项值,优先级最低

嗯,抱歉抱歉,我记错了,感谢指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 11:25:50 | 显示全部楼层
这。。这代码真的有必要写成这样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 13:39:46 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-25 13:42 编辑

&&
逻辑与
表达式 && 表达式
左到右

双目运算符

,
逗号运算符
表达式1,表达式2,表达式3,…
左到右


&& 运算顺序高于 ,

,号表达式返回最后一个表达式的结果!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 07:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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