Hevay 发表于 2020-8-24 22:17:38

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

本帖最后由 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 22:31:09

“用逗号分隔, 还是用短路与连接”其实都是表示两个条件同时满足的意思,在循环条件这里好像差别不大

Hevay 发表于 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);
        }

风过无痕1989 发表于 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-- 是一样的

Darth_EF 发表于 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 类型。

永恒的蓝色梦想 发表于 2020-8-25 08:03:58

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

胡说,逗号表达式取最后一项的值。

昨非 发表于 2020-8-25 09:12:26

永恒的蓝色梦想 发表于 2020-8-25 08:03
胡说,逗号表达式取最后一项的值。

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

嗯,抱歉抱歉,我记错了,感谢指正

SHRS23 发表于 2020-8-25 11:25:50

这。。这代码真的有必要写成这样吗

Cool_Breeze 发表于 2020-8-25 13:39:46

本帖最后由 Cool_Breeze 于 2020-8-25 13:42 编辑

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

双目运算符

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


&& 运算顺序高于 ,

,号表达式返回最后一个表达式的结果!
页: [1]
查看完整版本: 当循环中的判断条件不止一条时, 不同的连接符号会有不同