⑴ 關於c語言自增運算符的問題
運行以下代碼,可能會幫你理解
intmain()
{
intcount=0;
printf("%d%d%d ",count++,count++,count++);
printf("%d ",count);//後綴,先使用變數,待本語句結束後(遇到分號後),其值才會真正進行改變!
count=0;
printf("%d%d%d ",++count,++count,++count);//printf參數輸出,從右向左(在我的機器上是這樣,也許不同機器有不同),前綴,先改變變數,後使用變數
printf("%d ",count);
count=0;
printf("%d%d%d ",count++,++count,count++);
printf("%d ",count);
return0;
}
⑵ 關於C語言自增問題
第一題挺簡單的,++優先順序是很高的(所有單目運算符的優先順序都很高,僅次於擴號),所以要在所有++運算完之後再運算+法,也就是說,在運算+之前,i已經進行了兩次自増,由3增到了5,然後再相加,k當然就等於10了。
第二題,你是不是看錯題了?或者書印刷錯誤?這個k的值應該是8啊。C語言採用的是「最長匹配原則」,也就是在保證表達式有意義的前提下,從左到右盡可能多地將字元組成一個運算符,所以i+++(++i)等於是(i++)+(++i);i++是先引用後自増,運算完i++後,i變成4,但是i++表達式的值卻是3,然後接著運算++i,這時是先自増後引用,i=4的前提下自増,i就變5了,所以++i的表達式的值是5,然後運算+法,所以之後,k=8,i=5。
⑶ c語言中的自增運算
首先++優先順序大於+
所以等價於:int
y=(++a)+(a++)+(a++);
前置++,先加1後返回虧譽值。
後置++,先銷盯段返回值後加1。
(++a)=1(執行完後,此時a的值為1)
然後a++,先返回a的值,所以(++a)+(a++)=2(執行完後,此時a的值為2)。
所以(++a)+(a++)+(a++)=4(執行完後則行,此時a的值為3)
⑷ C語言關於自增的問題
標題可能有誤,如果是C++的話,一切沒問題;但是C語言中,如果按現在編譯器一般支持的ANSI C89/ISO C90標准,以上ABCD是全錯的(原因下面再講);如果是C99標准,那麼同C++。
C/C++中一個表達式可以是左值(lvalue),表示在實現中具有對應的運行期空間。從一般的C/C++實現而言,等價於保證在程序運行時必定存在一段內存中保存了左值的值(類型不會被保存)。(lvalue的l表示location之意,暗示可以作為一元操作符&的操作數;或者left,暗示這個表達式可以作為賦值操作符=的左操作數。)對於前置或後置的++、--,同賦值操作符=同樣,要求操作數必須是一個左值。而算術表達式和後置++、--表達式都不是左值,編譯器無法確定改寫這個值需要的指令作用的存儲器位置從而實現它的值進行++、--操作,因此ACD會引起編譯錯誤。C++中前置++、--的返回值是左值,因此只要B選項中p是在所在作用域中定義過的非const的可訪問的變數,就是正確的表達式。
C語言中,括弧()不改變表達式的左值屬性;一元運算符*、下標運算符[]返回左值;序列運算符(逗號表達式)返回左值但是deprecated(可能會被標準的以後版本廢除);其它如函數調用表達式,自增、自減、算術、邏輯、比較、賦值表達式等返回的都不是左值,所以ABCD都錯。
====
[原創回答團]
⑸ c語言自增問題,優先順序
關於自增的優先順序,簡單的可以這樣理解:
a++; printf("%d ",a++); =>可以看做先printf("%d ",a); 然後再執行a=a+1;如果現在繼續輸出printf("%d ",a);你就可以發現最後這個a的值是上一個a值多加了1;
++a; printf("%d ",++a); =>可以看做先a=a+1;然後再執行printf("%d ",a);如果現在繼續輸出printf("%d ",a);你就可以發現最後這個a的值根上一個a值相等;
a--; printf("%d ",a--); =>可以看做先printf("%d ",a); 然後再執行a=a-1;
--a; printf("%d ",--a); =>可以看做先a=a-1;然後再執行printf("%d ",a);
下面是我舉的例子(在vc++6.0運行的),可以幫助理解
---------- 2019.07.03 ----------
今天看到這道題,發現當年並沒有細分析出執行結果,現做出一下補充:
x 值計算要這樣分析:(編譯器邏輯有下面基本邏輯)
1. "花括弧操作符" 優先順序大於 "加號操作符"
2. 兩個連續的 "加號操作符" 執行時先執行第一個
3. 後自增只會在當前的所有操作執行完畢後才執行 (這一點是 x 值最重要的一點)
故需要將 x 分成兩大部分執行
一、(a++) + (a++) => 根據上面邏輯1和邏輯2兩點可以得到此時 a = 8; 第一部分得到 16; 此時要注意要符合 (邏輯3) 的要求 a 的後自增還未執行(後面還有加號操作)
二、16 + (a++) => 第二部分這里和容易可以看出就是先執行 16 + a => 16 + 8 = 24;
由於此時表達式已經沒有其他操作符執行了即在我們看來執行結束了,但其實 a 的後自增並未執行,此時編譯器還會去執行 a 的三次後自增; 故此時你 printf("%d ", a); 你能得到 a = 11;
y 值計算要這樣分析:(編譯器邏輯有下面基本邏輯)
1. "花括弧操作符" 優先順序大於 "加號操作符"
2. 兩個連續的 "加號操作符" 執行時先執行第一個
3. 先自增會在當前的操作執行完畢後執行 (這一點是 y 值最重要的一點)
故需要將 y 分成兩大部分執行
一、 (++a) + (++a) => 第一個加號先執行,但這里有花括弧(邏輯3)所以 a 先自增兩次此時得到 a = 13; 最後執行相加,此時第一部分值等於 26
二、 26 + (++a) => 第二個加號執行,這里也有花括弧 a 先自增一次得到 a = 14;
最後執行相加,最終 y 等於 40
上面的分析是根據 VC++6.0 編譯器進行的,其他編譯器不一定正確。