0

The following code is that I wrote to test my understanding of using for-loop in C, and using assignment statement inside for-loop in particular. But here I am getting unexpected output. Why does it do not assign 0 to the first 10 element of the array ?
And why does it do not print the array at all if I declare the array as array[10] instead of array[11]?
Can anybody explain ?

#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;
}
4

6 回答 6

6
((i < 10) || (array[i] = 0))

是懒惰的||,只要i < 10,表达式就会短路,甚至不会计算赋值。

改变循环的明显方法是 to;

for (i = 0; i < 10; ++i) 
    array[i] = 0;

...更具可读性,并且完全符合您的要求。

于 2013-06-29T10:33:18.137 回答
3

这两个问题都在这一行:

  int for (i = 0; ((i < 10) || (array[i] = 0)); ++i);

首先程序需要评估((i < 10) || (array[i] = 0))。在前 10 次迭代中,条件(i < 10)满足(不0),程序不需要计算array[i] = 0就知道整个表达式为真,所以它根本不执行第二部分,也没有完成赋值。

在前 10 次迭代之后,wheni变为10(i < 10)不再为真,程序最终分配0array[i]但它是array[10]- 的第十一个元素array。当数组只有十个元素时,赋值会使程序崩溃。

于 2013-06-29T10:42:06.397 回答
3

当它检查时(i < 10) || (array[i] = 0)它会短路。由于 i 小于 10,因此它永远不会进行赋值 - 语句将是 true while i<10

于 2013-06-29T10:33:43.233 回答
3
for (i = 0; ((i < 10) || (array[i] = 0)); ++i);

这个循环检查 i 的值是否小于 10 或不 bt 不等于 10 所以你需要在那里添加额外的逻辑运算符,

for (i = 0; ((i <= 10) || (array[i] = 0)); ++i);
于 2013-06-29T11:00:29.027 回答
0

那是因为编译器优化。当编译器评估||(逻辑或)时,首先它检查左侧值是真还是假。如果左侧值为真,则不执行右侧值。在您的代码中,直到 i 变为 10 它才会评估 array[i] =0;

如果你想让它适用于 i 的每个值,你可以降低编译器的优化级别。

于 2013-06-29T10:45:26.280 回答
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,这可能是一个问题。

于 2013-06-29T10:31:22.980 回答