【问题标题】:Function scope incorrect output [closed]功能范围不正确的输出[关闭]
【发布时间】:2014-11-15 01:15:20
【问题描述】:

当我运行此代码时,我得到的答案是 5,但我不明白它是如何工作的 以我自己的理解,这应该是一个无限循环 因为 number 的值在函数范围内永远不会改变 此函数的输出为 5,for 循环仅运行一次 我需要了解这里的条件是如何满足的。

#include <stdio.h>      

int num=7;      

int r();      

int main()
{    
    for(r();r();r())    
    {
        printf("%d",r());
        return 0;
    }
}

int r()
{
    return num--;
}

【问题讨论】:

  • 正确缩进/格式化代码,在循环内返回,根本不可能是无限的。
  • 只有一个num,而且肯定不止一个函数的作用域。
  • return 0; 只是在到达时立即结束主函数,因此不会再次循环。
  • 感谢您的建议,但我仍然对退货感到困惑。我已经阅读了一些答案“在内部函数(不是主函数)中返回将立即终止特定函数的执行,将给定的结果返回给调用函数。那么 retrun 在这里如何工作
  • “那么这里的 return 是如何工作的”——好吧,你刚刚解释过了。你不明白什么?

标签: c++ c function scope


【解决方案1】:

num 在执行过程中发生了什么?

num = 7;
r(); // first argument of for, init nothing → return 7, then num = 6
r(); // second argument of for → return 6, then num = 5
// third argument is done at the end of for, not now
printf("%d",r()); // execute r() → return 5, then num = 4, but print 5
return 0; // exit the current function or the process if it's in the main function

有关信息:

数字--; // 返回 num 然后减少 num --num; // 减少 num 然后返回 num

对于 ++ 运算符也是如此。

【讨论】:

  • 我知道在 printf("%d",r());该函数更新然后检查条件如何为假以终止循环。是不是因为return 0;
  • continue关键字开始下一个循环,break关键字退出所有循环。
【解决方案2】:

如果您正确缩进代码:

include <stdio.h>

int num = 7;

int r()
{
    return num--;
}

int main()
{    
    for(r(); r(); r()) {
        printf("%d", r());    
        return 0;    
    }
}

你会看到它不可能是一个无限循环,因为你是在第一次打印后从它返回的。

从 thze 函数外部看不到对局部变量的更改,但变量 num 是全局变量。 mainr 都看到了这个全局变量的同一个实例。

至于为什么答案是5,将for循环重写为等效的while循环:

int main()
{   
    r();                            /* init */
    while (r()) {                   /* condition */
        printf("%d", r());    
        return 0;
        r();                        /* update */
    }
}

函数r返回num的原始值。减量发生在返回之后。 (当然,它不会:编译器制作一个副本,递减并返回该副本。)

【讨论】:

    【解决方案3】:

    假设我们有这个for 循环,其中ABCD 是有效表达式:

    for (A; B; C)
    {
        D;
    }
    

    这相当于下面的while循环:

    A;
    while (B)
    {
        D;
        C;
    }
    

    由于循环中的Dprintf 调用,然后是return 语句,因此循环将只迭代一次(并且C 不会执行),然后从main 函数返回终止程序。

    至于为什么会打印出5,这是因为r在调用printf之前被调用了两次,从7两次减少到5

    如果你展开循环,它会像

    r();  // Initialization in `for` loop
    r();  // Condition in `for` loop
    printf(...);
    return 0;  // Terminates the program
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2014-05-29
      相关资源
      最近更新 更多