簡體   English   中英

函數調用中的意外輸出

[英]unexpected output in function calls

我有一個程序,在其中實現了以下主要功能,最后得到了意想不到的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 = fun(i=fun(fun(i)));

這會給你6

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

因為最后一次調用未將值分配給i,所以得到5。

同樣如湯姆在下文所述,我正在通過值而不是引用傳遞,如果您確實通過引用傳遞,那么如果您執行fun(fun(fun(&i)));則為6 fun(fun(fun(&i))); (取決於函數采用/返回的參數類型)。

您正在按值傳遞參數,然后返回該值。 變量i僅在初始化(設置為3)期間以及在對外部fun的調用中進行修改,在該外部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
}
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++ 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*指向的內存a* ,從而“違反”其范圍。 使用引用傳遞,可以使函數以您期望的方式運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM