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

时间:2017-10-16 19:07:49

标签: c

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

2 个答案:

答案 0 :(得分:4)

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

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

    • 首先执行初始表达式i > j,其结果为false(0)并且没有副作用,结果被忽略,因此可能被编译器完全省略。
    • second执行测试表达式i + j == 5,其计算结果为true(1),以便执行for循环的主体。
    • printf("Two columns\n");输出Two columns和换行符。
    • i = 5;i设为5。
    • j = 2;j设置为2。
    • }然后评估增量表达式:j < 2,其计算结果为false但没有副作用,结果将被忽略。
    • 然后循环再次评估测试表达式:i + j == 5现在评估为false(0),因为5 + 25不同。
    • 循环退出。
  • printf(" %d %d\n", i, j);会在您观察时输出数字52以及换行符。

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

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

答案 1 :(得分:0)

for (i > j; i + j == 5; j < 2)
  • for for循环初始化部分i > j没有意义
  • 然后i + j == 5条件变为true并针对循环体执行,其中分别为ij 52分配了新值。
  • 然后控制转到for循环增量部分,其中j < 2变为false。这也没有意义。
  • 然后再次控制进入条件部分i+j == 5变为假,因为我是5,而j是2.所以,7 == 5变为假。

因此,您的代码输出为5和2。