【发布时间】:2021-01-26 13:48:29
【问题描述】:
我不明白为什么下面的代码没有按预期工作:
#include <stdio.h>
int main() {
int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
while (i < size && oneOrZero[i++]);
if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: All ones.
当增加循环内的索引使代码按预期运行时:
#include <stdio.h>
int main() {
int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
while (i < size && oneOrZero[i]) {i++;}
if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: Has a zero.
有人能解释一下这两者的区别吗?
【问题讨论】:
-
仔细阅读
&&运算符的文档。如果左侧表达式为 0,则根本不会计算右侧表达式。阅读this, andd/or google c operator short circuit -
正如@Jabberwocky 已经说过的 && 和 ||评估已优化,因此如果第一个条件为 False (0),则不需要评估第二个条件,因为无论如何整体都是 False (0)。当第一个条件为 || 上的 True (1) 时,也会发生类似的事情。操作员。当你 i++ 处于第二个条件时,它并不总是像在 while 块上那样被评估。
-
正如@pmg 所说,当 i 的值为 8 时, oneOrZero[i] 返回 0 但是,在循环结束之前, i 递增,所以在下一个测试中 i 值为 9
-
@pmg 评论正确,这与操作员短路无关。
-
故事的寓意:
number_of_bugs_caused_by_post_increment++;。具有讽刺意味。
标签: c increment postfix-operator