功能范围错误输出

时间:2014-09-20 16:29:03

标签: c++ c function scope

当我运行此代码时,我得到了答案为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--;
}

3 个答案:

答案 0 :(得分: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然后返回num

++运算符也是如此。

答案 1 :(得分:0)

假设我们有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

答案 2 :(得分:0)

如果您正确缩进代码:

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的原始值。减量发生在返回之后。 (当然,它没有:编译器复制,递减并返回副本。)