输出c程序

时间:2018-03-30 06:32:07

标签: c++ c

运行以下代码时,输​​出为2 4 6.我预计它为2 5,依此类推...... 为什么会有差异?

 #include <iostream>
 using namespace std;
 int main() {
     static int i;
     for (i++; ++i; i++) {
     printf("%d ", i);
     if (i == 6)
         break;
     }
     return 0;
 }

<小时/> 在第二次迭代中,我在这里做了同样的事情,没有for循环。结果是5。 为什么?

#include <iostream>
using namespace std;
int main() {
    static int i=2;
    i++;
    i++;
    cout<<++i;
    return 0;
}

3 个答案:

答案 0 :(得分:2)

每次遍历循环时,你将i增加2,而不是3(我猜你预计会发生后者)。

一般情况下

for ( init_statement ; condition ; iteration_expression ) {
    loop_statements
}

相当于

init_statement
for ( ; condition ; ) {
    loop_statements
    iteration_expression
}

init_statement
while ( condition ) {
    loop_statements
    iteration_expression
}

请参阅,例如this

在你的情况下,

for (i++; ++i; i++) {
    ...
}

相当于

i++
for ( ; ++i; ) {
    ...
    i++
}

i++
while ( ++i ) {
    ...
    i++ ;
}

至于你的第二段代码,你提到“结果是5”。看起来你不希望这样,也许4.如果是这样,试着替换

cout<<++i;

cout<<i++;

(在句子中的其他操作之前与之后递增)。

答案 1 :(得分:0)

当您看到for循环的语法

for(initialize;condition;inc/decrement)

初始化块中的语句仅在for循环开始时执行一次,这就是为什么它将i递增2的原因。

希望有帮助

答案 2 :(得分:0)

for循环中,你有4个部分。我忘记了各个部分的“官方”名称,但我通常称它们为:

  1. 初始化
  2. 主播声明
  3. 后续
  4. 有效地:

    for(Initialization (1); Anchor Statement (2); Follow-up (4))
    {
        Body (3)
    }
    

    它将按以下顺序命中:

    1,2,3,4,[2,3,4] ......直到第2步评估为falsebreak语句被命中。然后退出。

    所以i0开头。 您点击了第1步和第2步,在步骤3(正文)中i评估为2

    然后,您点击步骤4和2,在步骤3中将i评估为4。

    然后您点击步骤4和2,在步骤3中将i评估为6.

    然后你有一个break语句将退出循环。

    似乎是混乱的重要部分是初始化步骤只运行一次。