我编写以下代码是为了测试我对for-loop
中使用C
的理解,特别是在for-loop
中使用赋值语句。但在这里我得到了意想不到的输出。为什么不将0
分配给array
的前10个元素?
如果我将数组声明为array
而不是array[10]
,为什么它根本不打印array[11]
?
有人可以解释一下吗?
#include <stdio.h>
int main() {
int i, array[11]; //array[10]
for (i = 0; ((i < 10) || (array[i] = 0)); ++i);
for (i = 0; ((i < 10) && (printf("%d\n", array[i]))); ++i);
return 0;
}
答案 0 :(得分:6)
((i < 10) || (array[i] = 0))
||
是懒惰的,只要i < 10
,表达式short circuit,甚至不会评估作业。
改变循环的显而易见的方法是:
for (i = 0; i < 10; ++i)
array[i] = 0;
...更具可读性,完全符合您的目标。
答案 1 :(得分:3)
检查(i < 10) || (array[i] = 0)
时它会短路。因为我小于10,所以它永远不会进行校对 - 在i<10
时该陈述是正确的。
答案 2 :(得分:3)
这两个问题都在这一行:
int for (i = 0; ((i < 10) || (array[i] = 0)); ++i);
首先,该计划需要评估((i < 10) || (array[i] = 0))
。在前10次迭代中,条件(i < 10)
得到满足(不是0
),程序不需要来评估array[i] = 0
以知道整个表达式为真,所以它根本不执行第二部分,并且没有完成任务。
在前10次迭代后,当i
变为10
且(i < 10)
不再为真时,程序最终会将0
指定给array[i]
但它是array[10]
- array
的第11个元素。当数组只有十个元素时,赋值会使程序崩溃。
答案 3 :(得分:3)
for (i = 0; ((i < 10) || (array[i] = 0)); ++i);
这个循环检查i的值是否小于10或者bt不等于10,所以你需要在那里添加附加的逻辑运算符,
for (i = 0; ((i <= 10) || (array[i] = 0)); ++i);
答案 4 :(得分:0)
要分配零,最简单的方法是使用:
int array[11] = {0};
在循环中,(i <10)变为TRUE,因此它不会继续(array [i] = 0)
你可以替换:
((i < 10) || (array[i] = 0))
用这个
((i < 10) | (array[i] = 0))
即使左边是真的,它也会强制评估右侧。
但是当变量i得到值10时,它会继续并且做arr [10] = 0 ...... 因此,如果您希望阵列的大小为10,则可能是个问题。
答案 5 :(得分:0)
那是因为编译器优化。当编译器评估||(逻辑OR)时,首先它检查左侧值是true还是false。如果左侧值为true,则不执行右侧值。在你的代码中,直到我变为10,它不会计算数组[i] = 0;
如果要使其适用于i的每个值,可以降低编译器的优化级别。