C++ 函数调用中的意外输出
我有一个程序,在其中我实现了如下的主要功能,最后我得到了一个意想不到的值iC++ 函数调用中的意外输出,c++,c,C++,C,我有一个程序,在其中我实现了如下的主要功能,最后我得到了一个意想不到的值i 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 这会给
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
这会给你6分
fun(i=fun(fun(i)));
因为最后一次调用没有将值分配给i,所以得到5
正如Tom在下面提到的,我是通过值而不是引用传递的,如果你通过引用传递,那么如果你通过
fun(fun(fun&i)),它将是6代码>(取决于函数采用/返回的参数类型)。您正在按值传递参数,并返回该值。变量i
仅在初始化期间(设置为3)和在调用外部fun
时进行修改,其中取fun(fun(3))返回的值5
<> > > >编辑> <强> C++(在@ Ad林地删除该标签之前):
如果要修改函数中的外部变量,可以使用引用进行修改:
int& fun( int & x ) {
return ++x;
}
int main() {
int i = 3;
fun( fun( fun( i ) ) );
// fun( i = fun( fun( i ) ) ); // alternatively
}
我的猜测是,您的期望来自于i++
作为i=i+1
的惯例,虽然这是事实,但您这里的问题是范围。在C中调用函数时,如下面所示:
int add( int a, int b ) {
a = a + b;
return a;
}
您正在传递值。也就是说,C生成了一个值的副本,因此有一个不同的范围,因此在add
中发生的事情只会影响add中的事情
在C中传递数据的另一种方法是通过如下引用
int * add( int * a, int b ) {
(*a) = (*a) + b;
return a;
}
该函数将变异a*
指向的内存,因此“违反”了它的作用域。使用PASS BASIC,你可以按你所期望的方式来执行功能。为什么你会期望它是6?@ Ad林地:为什么你要删除C++标签?@戴维——没有什么C++,它使用的是代码> Prtff。C@awoodland虽然不是iDimic C++,具有适当的包含的代码将编译在任何C++编译器中。我认为最好是让这个人(这个例子的老师)来决定这个问题的实际语言,注意如果是C++的话,他可能会得到更多的评论。idiomatic@David-同意。我担心的是,答案会是不同的,这取决于C或C++的哪个,我(不恰当地)对问题进行了有根据的猜测。但这难道不意味着C标记不合适吗?@awoodland:问题是,我不知道这两种语言中哪一种是老师感兴趣的,删除其中一种的决定是任意的。另一方面,答案是明确地处理一种语言C++,但这并不意味着老师对C++感兴趣,只有如果C++是C++的话,这将是另一种选择。
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 .
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 .