【问题标题】:Assignment statement inside for-loopfor循环内的赋值语句
【发布时间】:2023-03-28 07:46:01
【问题描述】:

下面的代码是我写来测试我对在C中使用for-loop的理解,特别是在for-loop中使用赋值语句。但在这里我得到了意想不到的输出。为什么不将 0 分配给 array 的前 10 个元素?
如果我将数组声明为array[10] 而不是array[11],为什么它根本不打印array
谁能解释一下?

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

【问题讨论】:

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


    【解决方案1】:
    ((i < 10) || (array[i] = 0))
    

    || 是惰性的,只要i &lt; 10,表达式就会short circuit,甚至不会计算赋值。

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

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

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

    【讨论】:

    • 如果您真的不想使用for 循环的主体(无论出于何种原因),您可以在for 的第三部分使用逗号运算符:@987654328 @
    【解决方案2】:

    这两个问题都在这一行:

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

    首先程序需要评估((i &lt; 10) || (array[i] = 0))。在前 10 次迭代中,满足 (i &lt; 10) 条件(不是 0),程序不需要评估 array[i] = 0 以知道整个表达式为真,因此它不执行第二部分根本没有完成。

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

    【讨论】:

    • 但是,为什么第二个 for-loop 甚至没有 `printf' 垃圾值?
    • 它应该打印垃圾,至少在数组大小为 11 时(在 VS2010 中检查)。如果数组大小为 10,则程序可能会在打印之前的赋值时崩溃,尤其是在某些调试配置中编译时(带有数组绑定检查)。
    【解决方案3】:

    当它检查(i &lt; 10) || (array[i] = 0) 时,它会短路。由于 i 小于 10,它永远不会进行分配 - 当 i&lt;10 时,该语句将是真的。

    【讨论】:

      【解决方案4】:
      for (i = 0; ((i < 10) || (array[i] = 0)); ++i);
      

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

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

      【讨论】:

        【解决方案5】:

        分配零最简单的方法是使用:

        int array[11] = {0};
        

        在循环中,(i

        你可以替换:

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

        有了这个

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

        它将强制评估右侧,即使左侧为真。

        但是当变量 i 得到值 10 时,它会继续执行 arr[10] = 0... 因此,如果您希望数组大小为 10,这可能是个问题。

        【讨论】:

        • 不,这个任务完全是故意的。
        • 我试图用0 填充数组。它不是条件语句。
        【解决方案6】:

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

        如果你想让它对 i 的每一个值都起作用,你可以降低编译器的优化级别。

        【讨论】:

        • 不是“编译器优化”而是强制语言规则
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        • 2015-01-18
        • 2016-01-17
        • 2021-04-08
        相关资源
        最近更新 更多