首先 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++*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...