C++ 函数调用中的意外输出

C++ 函数调用中的意外输出,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 这会给

我有一个程序,在其中我实现了如下的主要功能,最后我得到了一个意想不到的值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
这会给你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 .