【问题标题】:Cannot understand for loop with two variables [duplicate]无法理解带有两个变量的for循环[重复]
【发布时间】:2013-10-12 05:33:51
【问题描述】:

当我在具有不同条件的 for 循环中使用两个变量时,就像我在下面使用的两个条件 i<3,j<2 时,for 循环始终执行,直到第二个条件失败。

#include<iostream>
#include<conio.h>
using namespace std ;
int main()
{
int i,j ;
for(i=0,j=0;i<3,j<2;i++,j++)
{
    cout<<"hello" ;
}
getch() ;
return 0 ;
} 

在该代码中,hello 被打印 2 次。为什么?

如果我使用i&lt;3,j&lt;10,“Hello”会打印 10 次。我不明白为什么第一个条件被忽略了。是编译器依赖还是其他原因?

如果我用 || 之类的条件替换,一切都会正常进行(OR) 或 &&(AND)。另一件事是我无法在 for 循环本身中初始化 i 和 j,它向我显示一个错误,但是当我以 C 风格声明变量或 for 循环外的一个变量时工作正常,为什么会这样?

我使用的编译器是 Orwell Dev C++。
提前致谢。

【问题讨论】:

  • 你和许多其他困惑的人一样,遇到了逗号运算符。
  • i&lt;3,j&lt;2 是一种写条件的有趣方式...(可编译,但是...)
  • 通过这个:它可以帮助stackoverflow.com/questions/1232176/…
  • 与其说是“有趣”,不如说是在试图混淆视听。第一部分被丢弃,所以你可以说,“i > 0, j
  • g++-4.8 7:14: warning: left operand of comma operator has no effect

标签: c++ loops for-loop declaration


【解决方案1】:

for(i=0,j=0;i&lt;3,j&lt;2;i++,j++)

等价于

for(i=0,j=0;j&lt;2;i++,j++)

逗号表达式采用最后一个表达式的值。

无论哪个条件是第一个,都将被忽略,只使用第二个。

【讨论】:

  • 但是为什么我不能在循环本身中声明i和j。帖子中问题的第二部分
  • @Arun 可能是你应该从一本好书重新访问for 循环
  • @Arun 您没有向我们展示产生错误的代码,也没有向我们展示您遇到的具体错误,所以我们只能猜测。
【解决方案2】:

c 编译器总是使用第二个条件。

因此使用 j

使用这个循环

      for(i=0,j=0;j<10;i++,j++)

【讨论】:

    【解决方案3】:

    for 循环包括:

    for(START_STATEMENT; CONDITION_EXPRESSION, LOOP_EXPRESSION) BODY_BLOCK

    地点:

    • START_STATEMENT 是任何单个语句,其中可能包含变量声明。如果要声明2个变量,可以写int i=0, j=0,但不能写int i=0; int j=0,因为后者实际上是2个语句。同样节点,该变量声明是语句的一部分,但不能是(子)表达式的一部分。这就是为什么int i=0, int j=0 也不正确的原因。

    • CONDITION_EXPRESSION 是任何 single 表达式,其计算结果为布尔值。在您的情况下,您使用的是 coma 运算符,它具有以下语义:A, B 可以:

      • 评估 A(它会评估,而不仅仅是忽略)
      • 放弃A的结果
      • 评估 B
      • 返回 B 作为结果

      在你的情况下:i&lt;3,j&lt;2正在比较i&lt;3,你只是忽略了这个比较的结果。

      当指令有一些副作用时,逗号表达式很有用,而不仅仅是返回一个值。常见情况有:变量递增/递减或赋值运算符。

    • LOOP_EXPRESSION 是任何 single 表达式,不必计算任何内容。在这里,您再次使用逗号表达式,忽略左侧的结果。但是,在这种情况下,您无论如何都不会使用结果,而只是使用 ++ 副作用 - 即增加变量的值。

    • BODY_BLOCK 是单个语句或块,用花括号封装。

    以上for可以类比为:

    {
        START_STATEMENT;
        while(EXPRESSION) {
            BODY_BLOCK;
            LOOP_EXPRESSION;
        }
    }
    

    【讨论】:

    • 为什么要“继续”指令?它不会修改任何内容。
    • 不需要。它存在于以前的(不正确的)版本中,我很快纠正了它,但把它留在那里。
    • 好的,我想要它;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2020-10-05
    • 2014-06-21
    • 1970-01-01
    • 2021-12-20
    • 2016-03-15
    • 2014-06-12
    相关资源
    最近更新 更多