函数调用中的意外输出

时间:2011-09-02 15:53:58

标签: c++ c

我有一个程序,我已经实现了如下的主要功能,最后我得到了一个意想不到的值。

 int main()
    {
        int fun (int);
        int i=3;
        fun(i=fun(fun(i)));
        printf("%d",i);
        return 0;
    }

我的函数实现是

int fun(int i)
{
    i++;
    return(i);

}

我的输出是:

5

我的期望是:

6

4 个答案:

答案 0 :(得分:5)

i = fun(i=fun(fun(i)));

这会给你6

fun(i=fun(fun(i)));

这给出了5,因为最后一次调用没有将值赋给i。

同样如下面的Tom所提到的,我通过值而不是引用传递,如果你通过引用传递,那么如果你做了fun(fun(fun(&i)));则它将是6(取决于函数采用/返回的参数类型)。

答案 1 :(得分:2)

您正在按值传递参数,并返回该值。变量i仅在初始化期间(设置为3)和对外部fun的调用中进行修改,其中它取自fun(fun(3))

返回的值5

编辑仅限C ++(在@awoodland从问题中删除该标记之前):

如果要在函数中修改外部变量,可以使用引用

int& fun( int & x ) {
  return ++x;
}
int main() {
   int i = 3;
   fun( fun( fun( i ) ) );
// fun( i = fun( fun( i ) ) ); // alternatively
}

答案 2 :(得分:1)

i = 3;

fun(i=fun(fun(i)));
        +
        |
        V
fun(i=fun(fun(3)));
        +
        |
        V
fun(i=fun(4));       /* fun (3) returns 4 */
        +
        |
        V
   fun(i=5);         /* fun (4) returns 5 and it is stored in i */
        +
        |
        V
    fun(5);         /* fun (5) returns 6, but it is NOWHERE stored, i is still 5 */

print i results in 5 .

答案 3 :(得分:0)

我的猜测是你的期望来自i++的{​​{1}}约定,虽然这是真的,但你的问题是范围。当您在C中调用函数时,请添加:

i = i + 1

你正在经历价值。也就是说C正在生成值的副本,因此你有一个不同的范围,因此int add( int a, int b ) { a = a + b; return a; } 内发生的事情只会影响add中的内容。

您可以在C中传递数据的另一种方法是像

那样引用
add

该函数将改变int * add( int * a, int b ) { (*a) = (*a) + b; return a; } 指向的内存,从而“违反”它的范围。使用传递引用,您可以按照预期的方式执行您的功能。