我有一个程序,我已经实现了如下的主要功能,最后我得到了一个意想不到的值。
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
答案 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))
编辑仅限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;
}
指向的内存,从而“违反”它的范围。使用传递引用,您可以按照预期的方式执行您的功能。