谁能告诉我为什么这个程序运行?
问题描述:
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;
}
答
下面是按顺序执行以下步骤:
-
int i = 0, j = 5;
局部变量i
和j
被定义并初始化为0
和5
分别 -
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 + 2
与5
不同。 - 循环退出。
- 首先执行启动al表达式
printf(" %d %d\n", i, j);
输出数字5
和2
,当你看到一个换行符。-
return 0;
main
返回值为0
,这是一个成功的退出状态。
此代码非常愚蠢,故意误导,因为它在for
语句标题的所有3个部分都有测试表达式。只有中间一个是测试表达式,第一个和最后一个表达式仅用于副作用,例如初始化和递增循环计数器。
答
for (i > j; i + j == 5; j < 2)
- 在用于环路初始化部分
i > j
没有有意义 - 然后
i + j == 5
条件成为true
以及对于在其中分配的新值,以i
和j
分别5
和2
循环体执行。 - 然后控制去循环增量部分,其中
j < 2
变成false
。这也没有任何意义。 - 然后再次控制去条件部分
i+j == 5
成为false因为我是5和j是2.因此,7 == 5
成为false。
所以,你的代码的输出是5和2
即使什么 –
所以它运行一个迭代您正在使用错误的循环,因为J>时2真正的第一次,这就是为什么它的回归5 2。 – Talal
我觉得你对'i> j'部分感到困惑。看起来循环不应该开始,因为'i'小于'j'。 –