徹底搞清 C C 中a 與 a的區別

2021-06-28 17:27:25 字數 1874 閱讀 5568

首先 a++和++a 的定義:看個例子

a:    a=5;  b=++a; // 相當於a=a+1;b=a;  結果是a=6,b=6

b:    a=5;  b=a++; // 相當於b=a;a=a+1; 結果是a=6,b=5

所以書上有:

(1)   如果用字首運算子對乙個變數增1(減1),則在將該變數增1(減1)後,用新值在表示式中進行其他的運算。

(2)   如果用字尾運算子對乙個變數增1(減1),則用該變數的原值在表示式中進行其他的運算後,再將該變數增1(減1)後。

這裡就有個問題,對於字尾運算,」用該變數的原值在表示式中進行其他的運算後「該如何理解,也就是說啥時才算表示式運算完啦。

舉個列子:求a的最終值

int a=3;

a+=a+=a++*a--;

計算過程如下:

先算a++*a--

由於a=3

a++等於3 //這裡字尾++中的第二步自加運算還沒有進行

a--等於3 //這裡字尾--中的第二步自減運算還沒有進行

所以 ++*a-- 等於9

a+=a++*a-- 等於a+=9等於a=a+9=3+9=12

在算a+=a 等於a=a+12=12+12=24

然後在進行再字尾++中的第二步自加運算和字尾--中的第二步自減運算

即進行 a=a+1;此時a=25;再進行a=a-1;此時a=24 所以最終a=24

說明在乙個表達中,無論有多少個等號(賦值號)都必須進行完所有的運算子後,才能進行字尾自加,自減。那麼什麼時候才能

算本計算單位已經結束。下面某些摘自《c語言深度剖析》

i++ 在遇到每個逗號,分號後,才認為本計算單位已經結束,i 這時候自加。

關於逗號表示式與「++」或「--」的連用,還有乙個比較好的例子:

int x;

int i = 3;x = (++i, i++, i+10);

問 x的值為多少?i的值為多少?

按照上面的講解,可以很清楚的知道,逗號表示式中,i 在遇到每個逗號後,認為本計算

單位已經結束,i 這時候自加。所以,本例子計算完後,i的值為5,x的值為 15。

關於符號的貪心法c 語言有這樣乙個規則:每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程

序分解成符號的方法是,從左到右乙個乙個字元地讀入,如果該字元可能組成乙個符號,

那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組

成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串

已不再可能組成乙個有意義的符號。這個處理的策略被稱為「貪心法」。需要注意到是,除

了字串與字元常量,符號的中間不能嵌有空白(空格、製表符、換行符等) 。比如:==是單個符號,而==是兩個等號。

按照這個規則可能很輕鬆的判斷 a+++b表示式與 a++ +b一致。那++i+++i+++i;會被解

析成什麼樣子呢?希望讀者好好研究研究。另外還可以考慮一下這個表示式的意思a+++++b?

分析:++i+++i+++i由於字尾自增,自減優先順序比字首高(ansi/iso c++中),編譯器等效理解

為++(i++)+(i++)+i,而i++不可以作左值,所以++(i++)錯誤,故此表示式錯誤

a+++++b 編譯器將其理解為(a++)++ +b, 由於a++不可以作左值,所以(a++)++錯誤,故此表示式錯誤

另外特別注意++i在c中不是左值,在c++中才是。在c語言中像 int i=0,a=2,b=3;++i=a+b;這個表示式是非法的。

i++在c和c++中都不能作左值。

徹底搞清 C C 中a 與 a的區別

首先 a 和 a 的定義 看個例子 a a 5 b a 相當於a a 1 b a 結果是a 6,b 6 b a 5 b a 相當於b a a a 1 結果是a 6,b 5 所以書上有 1 如果用字首運算子對乙個變數增1 減1 則在將該變數增1 減1 後,用新值在表示式中進行其他的運算。2 如果用字尾...

徹底搞清 Kettle 資料分發方式與多執行緒

目錄 1.分發方式 1 輸入兩線程,輸出單執行緒 2 輸入單執行緒,兩個輸出,乙個單執行緒 另乙個兩線程 3 輸入單執行緒 兩個輸出均為兩線程 4 所有步驟均為兩線程 5 輸入步驟為兩線程,輸出步驟為四執行緒 2.複製方式 1 輸入兩線程,輸出單執行緒 圖4 2 輸入單執行緒,兩個輸出,乙個單執行緒...

yield和send的執行循序徹底搞清

yield 對於yield方法和generator的send同時使用時的執行順序一直搞不清,今天看到這篇 理解php中的generator 加上測試,終於搞清了。總結一下上文中的結論 幾個經典的例子幫助理解!1.經典的例子熱身 function xrange start,end,step 1 for...