for循环中的赋值语句

时间:2013-06-29 10:29:18

标签: c++ c arrays for-loop printf

我编写以下代码是为了测试我对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;
}

6 个答案:

答案 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的每个值,可以降低编译器的优化级别。