谁能告诉我为什么这个程序运行?

问题描述:

c编程新手。这是来自作业的问题。任何人都可以告诉我为什么这段代码仍然输出两列5和2,尽管我小于j。谁能告诉我为什么这个程序运行?

#include <stdio.h> 

int main(void) { 
    int i = 0, j = 5; 
    for (i > j; i + j == 5; j < 2) { 
     printf("Two columns\n"); 
     i = 5; 
     j = 2; 
    } 
    printf(" %d  %d\n", i, j); 
    return 0; 
} 
+5

即使什么 –

+0

所以它运行一个迭代您正在使用错误的循环,因为J>时2真正的第一次,这就是为什么它的回归5 2。 – Talal

+1

我觉得你对'i> j'部分感到困惑。看起来循环不应该开始,因为'i'小于'j'。 –

下面是按顺序执行以下步骤:

  • int i = 0, j = 5;局部变量ij被定义并初始化为05分别
  • for (i > j; i + j == 5; j < 2) {

    • 首先执行启动al表达式i > j其计算结果为假(0)并且没有副作用,结果被忽略,因此可能被编译器完全省略。
    • 第二次执行测试表达式i + j == 5,计算结果为真(1),因此执行for循环的主体。
    • printf("Two columns\n");输出Two columns和一个换行符。
    • i = 5;i至5
    • j = 2;j至2
    • }然后递增表达式求值:j < 2,其评估为假,但没有副作用,则结果将被忽略。
    • 然后循环再次评估测试表达式:i + j == 5现在计算结果为false(0),因为5 + 25不同。
    • 循环退出。
  • printf(" %d %d\n", i, j);输出数字52,当你看到一个换行符。

  • return 0;main返回值为0,这是一个成功的退出状态。

此代码非常愚蠢,故意误导,因为它在for语句标题的所有3个部分都有测试表达式。只有中间一个是测试表达式,第一个和最后一个表达式仅用于副作用,例如初始化和递增循环计数器。

for (i > j; i + j == 5; j < 2) 
  • 在用于环路初始化部分i > j没有有意义
  • 然后i + j == 5条件成为true以及对于在其中分配的新值,以ij分别52循环体执行。
  • 然后控制去循环增量部分,其中j < 2变成false。这也没有任何意义。
  • 然后再次控制去条件部分i+j == 5成为false因为我是5和j是2.因此,7 == 5成为false。

所以,你的代码的输出是5和2