for循环,为什么总是执行最后一个条件?

now*_*wox 1 c for-loop

我对 CCOND3中的for循环感到困惑。我一直认为最后一个条件不是在最后一次迭代时执行的,而是流程如下:

  START
    |
    v
+-------+
| COND1 |
+---+---+         +-------+
    |<------------+  CODE |
    |             +-------+
    |                 ^
    v                 |              
+-------+         +---+---+
| COND2 |--true-->| COND3 |
+-------+         +-------+
    |
    v
+-------+
| COND3 |
+---+---+   
    |
    v
   END
Run Code Online (Sandbox Code Playgroud)

在哪里:

for(COND1; COND2; COND3) { CODE }
Run Code Online (Sandbox Code Playgroud)

重复 COND3 似乎很奇怪,这个流程似乎不合逻辑。例如在这段代码中,COND3在结束之前重复:

int main(void) {
    for (int i=0; i < 3; i++, printf("-"))
        printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

这使:

0-1-2-
Run Code Online (Sandbox Code Playgroud)

Bra*_*pel 7

for (expr1; expr2; expr3)
    statement;
Run Code Online (Sandbox Code Playgroud)

相当于:

expr1;
while (expr2) {
    statement;
    expr3;
}
Run Code Online (Sandbox Code Playgroud)

expr2考虑到循环正常退出(没有 return 或 break 语句)并且statement;不包含continue语句,检查的最后一个条件是。请参阅下面的讨论。


Sto*_*ica 6

那不是布局。第三个表达式,增量,无条件地执行CODE比特。实际流程是这样的。

  START
    |
    v
+-------+
| INIT  |
+---+---+         +-------+
    |<------------+  INC  |
    |             +-------+
    |                 ^
    v                 |              
+-------+         +---+---+
| COND  |--true-->| CODE  |
+-------+         +-------+  
    |
    v
   END
Run Code Online (Sandbox Code Playgroud)

  • @nowox 请注意上图中检查 COND 之前的 CODE 之后的 INC。这与您的代码示例一致。 (3认同)