程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 簡述C疑難雜症_序列點(二)

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

編輯:關於C

引問: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 i[12]={3,3,3,3,3,3,3,3,3,3,3,3};
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++){
cout< }
return 0;
}

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

\\\

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved