[英]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.