1樓:匿名使用者
p=f(i,++i);函式呼叫時,伏空自右向左,先執行++i,在執行i。++i 時,i先加1,在傳值,因此b的值為3。之後傳遞i,i已經自增1,因此a的值也為3。
你不妨瞎春在函式中加缺神瞎一句,輸出a,b的值或者在除錯中檢視a,b的值。
2樓:匿名使用者
首先糾正你一點,這個是c語言程式不是c++;在引數裡++i 和i++是沒區別悔氏歲的就像for(i=0;i<4;i++)for(i=0;i<4;++i)如果碧睜不是引數的話++i是先加1i++是先做其他運算然後加1---操作符運算優先順序一共有十五個優先順序:
2 ! 負號) +取變數位址)* type)(強制型別) sizeof
3 * 核野 %
15 ,結合性:2 13 14 是從右至左 其他都是 從左至右。
3樓:匿名使用者
_stdcall這種呼叫方式引數入棧順序是從右向左的,所以才會先計算++i一反彙編就可以看檔橋出來了行鬥猛mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eaxmov ecx,dword ptr [i]push ecx ;+i入棧。
mov edx,dword ptr [i]push edx ;i入棧。
call f pascal語言是從左向右的 其他的基本銷森都是從右向左。
4樓:匿名使用者
+i是先+1再使用。傳進函式後兩個引數相等就姿鍵輸出0嘍 如果想驗證一下的話你可以在自定義的函式里笑改把a,b都列印出來,這樣就看得清楚了碰冊判。
c語言求值順序問題
5樓:仙清漪遲蕤
因為你放在前面的時候b你沒有給值誒。
仍然是乙個記憶體中的隨機數。
所以語句放在最前面的時候c=a/b這裡的b不是你輸入的值而是乙個隨機數。
如果放在後面的話編譯器就會將你輸入的數字代替記憶體中的那個隨機數運算就可以正常進行了。
及時採納~不懂再問。
6樓:隋莊雅鄭炎
函式引數的求值順序是自右向左」更是大錯特錯。樓主,c語言跟大多數語言一樣,沒有規定表示式的求值順序,除了以下幾個順序點:
分號,標誌一條語句。
7樓:網友
最終要的是賦值運算子的右結合優先。
bufptr++=n 這個語句拆解開來可以成為 *bufptr=n;bufptr=bufptr+1;
這句話拆解完成沒有兩義性。
而你舉出來的反例,y[i]=x[i++]由於賦值運算子的右結合優先,所以可能會引起兩義,即你前面定義的 i 是要求保留原值還是 自加後的值。導致期望和輸出不相符。
個人理解 希望能幫到你。
8樓:記住一座城
*bufptr++=n; //這一句求值是確定的。 先對指標解引用再賦值,最後指標的值自增。
y[i]=x[i++]//這一句「=「左右都對i變數進行了操作,所以求值順序是不確定的。
舉個例子,i = 3;
有兩種求值方法 = x[3];
x[3];
9樓:網友
*bufptr++=n在語義上也是不明確的,但是*解引用的值是明確的,就是bufptr在++前的值,所以這句話沒有在編譯器看類沒有歧義,但是不建議用這種語義模糊寫法,看著很厲害,其實容易被看**的人誤會。
C語言,函式指標定義中實參表為空的問題
如果函式宣告是void fun int n,char s 那麼指向該函式的指標宣告也必須是void pf int,char void pf 是錯誤的,不能用於指向該函式。函式指標只是個指標,關鍵是呼叫時,引數是否一致。c語言函式宣告中將函式指標引數設定為null的預設值 指定形參預設值是c 的語法,...
關於c程式子函式的問題
按照程式的編譯順序,如果在程式中使用函式前,已經有了函式的定義,或者是函式的宣告,或者沒有呼叫函式,那麼,程式都可以正常執行。例如,將函式定義部分,放在main前面,那麼,main中使用函式呼叫不會報錯!如果你呼叫該函式的程式在前邊,那麼必須在呼叫該函式之前宣告一下。對於養成良好的程式設計習慣和優秀...
C程序問題,C程式問題
i從0到5 輸出結果應該是123345 函式fun 就是對陣列a從a 2 到a 9 實行資料的後移,例如,a 9 的值傳給a 10 a 8 原來的值傳給a 9 直到a 2 的值傳給a 3 一共是7次 呼叫函式之後,a陣列的資料變成了 通過for迴圈把陣列a中的a 0 到a 5 的值依次輸出來,所以應...