【问题标题】:explain the for loop and output of this C code please [closed]请解释此C代码的for循环和输出[关闭]
【发布时间】:2019-12-30 22:09:04
【问题描述】:

谁能给我解释一下这个 C 代码。这是我在考试中为找到输出而提出的问题之一。

#include<stdio.h>

int r()
{
    static int num = 7;
    return num--;
}

int main()
{
    for(r(); r(); r())
        printf("%d\n",r() );
}

我不明白 for 循环是如何工作的(条件和递增/递减语句)以及这段代码如何给出这个输出。

Output:
5
2

【问题讨论】:

  • 使用调试器。在r() 中的return num-- 行和printf() 语句上设置断点。单步执行代码,您应该会确切地看到该输出是如何产生的。
  • 你确定你的代码是写的吗?似乎由于num 在每次调用r() 时都被初始化,r() 将始终返回7(在return 之后将其递减)。
  • @daShier 是的,代码是正确的,它使用'static int num',所以它不会总是'返回'7

标签: c loops for-loop operators decrement


【解决方案1】:

让我们考虑一下循环

for(r(); r(); r())

函数r在init表达式中被调用

for(r(); r(); r())
    ^^^

它的静态变量num减少,等于6

然后检查循环的条件

for(r(); r(); r())
         ^^^

再次调用该函数,其静态变量变为等于5

printf的电话内

printf("%d\n",r() );

这里调用了函数r。因为在函数中使用了后减运算符,所以函数返回 5 但num 的值等于4。所以输出返回值5。

然后计算循环的第三个表达式。

for(r(); r(); r())
              ^^^

num 等于 3。

再次检查条件,num 等于 2。

for(r(); r(); r())
         ^^^

printf的调用中,返回值2被输出,但在函数r中,num的值被递减并变为等于1。

之后循环的第三个表达式被求值。

for(r(); r(); r())
              ^^^

num 等于 0。

该值由函数 r 在条件中返回。在函数内,静态变量现在等于 -1。

由于返回值为 0,循环停止其迭代。

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2 后缀 ++ 运算符的结果是操作数的值。 作为副作用,操作数对象的值递增(即 即,将相应类型的值 1 添加到其中)...

3 后缀 -- 运算符类似于后缀 ++ 运算符, 除了操作数的值递减(即 减去相应类型的值 1)。

【讨论】:

  • 谢谢你这么好的解释
【解决方案2】:

表单的for 循环

for(init; condition; repeat) {
    body;
}

大致相当于

init;
while (condition) {
    body;
    repeat;
}

所以你给定的语句相当于:

r();
while (r()) {
    printf("%d\n", r());
    r();
}

第一次调用r 将静态变量num 初始化为7。然后它返回这个值,同时将它递减到6。没有使用这个返回值。

然后测试while 条件。此对r() 的调用返回值6,同时将num 递减至5。由于这是非零,所以条件成功,所以我们进入循环体。

然后它执行printf("%d\n", r());。此对r() 的调用返回值5,同时将变量递减为4。返回值由printf()打印,所以我们看到5

然后我们调用r()作为重复操作。这会将num 递减为3,并忽略返回值。

然后我们回到while 条件。这会将num 递减为2,同时返回3。这是非零的,所以我们进入身体。

然后我们执行printf("%d\n", r());。与上一次迭代一样,r() 返回num 的当前值,同时将其递减为1,因此会打印2

然后我们调用r()作为重复操作。这会将num() 递减为0 并返回1,但忽略返回值。

我们回到while 条件。这一次,r() 返回当前值0,同时将其递减为-1。这一次,返回值为零,所以循环停止。

【讨论】:

  • 谢谢,先生!我认为我需要进一步研究init
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2016-10-05
  • 2014-09-24
  • 2015-07-13
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多