簡述C疑難雜症 序列點(二)

2021-06-23 06:06:17 字數 1343 閱讀 4920

引問:int i=3;  int b=i++*i++;為什麼最後的結果是b=9?

答案:(1)標準規定,兩個序列點之間,程式執行的順序可以是任意的,如果乙個物件被修改多次,最後留下的是哪次的結果就不確定。不同編譯器執行的結果可能就不一樣。

(2)在相鄰的兩個序列點之間,乙個物件最多隻允許被修改一次。

(3)c語句結束標誌分號(;)是

序列點中的一種

。也就是說,c

語句中由賦值、自增或者自減等引起的***(side effect)在分號之前必須結束。

(4)沒有任何保證確保自增或自減會在輸出變數原值之後和對表示式的其它部分進行計算之前立即進行。也不能保證變數的更新會在表示式 「完成」 (按照 ansi c 的術語, 在下乙個」序列點」之前) 之前的某個時刻進行。本例中, 編譯器選擇使用變數的舊值相乘以後再對二者進行自增運算。

只有到達乙個序列點之後,自增運算才能保證真正被執行(即只要保證在上乙個序列點之後到這乙個序列點之間的任一時刻執行即可)。

程式分析:

#include

using namespace std;

int main(int argc,char *argv);

int b[12];

b[0]=i[0]++*i[0]++;

b[1]=++i[1]*++i[1];

b[2]=++i[2]*i[2]++;

b[3]=i[3]++*++i[3];

b[4]=i[4]++*i[4]++*i[4]++;

b[5]=i[5]++*i[5]++*++i[5];

b[6]=++i[6]*++i[6]*++i[6];

b[7]=++i[7]*++i[7]*i[7]++;

b[8]=++i[8]*i[8]++*i[8]++;

b[9]=++i[9]*i[9]++*++i[9];

b[10]=i[10]++*++i[10]*++i[10];

b[11]=i[11]++*++i[11]*i[11]++;

for(int j=0;j<12;j++)

return 0;}

下圖左側為codeblocks執行結果,右側為vs2010執行結果,可以將以上概念結合以下執行結果對比性記憶理解。

ps:由於作者技術水平有限,如有錯誤和不恰當之處,還望讀者不吝賜教!

C 指標疑難雜症

const修飾指標 防止誤操作 const修飾指標,指標指向可以變,但是值不可以改變 int a 100,b 200 const int p a 指向可以變 p 100 值是不可以變const修飾變數,指標指向不可以改,指標的值可以改 int const p a 既修飾指標,又修飾常量 int a ...

Hadoop疑難雜症

前天安裝了pig,本來寫了條pig latin,但一直卡在 17 05 07 17 47 07 info mapreduce.job running job job 1494150363568 0001跑不通,想著肯定是mapredcue自身有問題,於是開始了艱苦的檢錯之旅,從csdn到stackf...

Appium疑難雜症

坑之初體驗 1.session大於60秒沒接收到命令自動關閉 python desired caps 在啟動配置裡面加入newcommandtimeout引數 desired caps newcommandtimeout 200 但是注意cnpm預設在當前目錄安裝npm包。3.uiautomatio...