精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

二級考試C基礎:C語言的優先性和結合方向

發布時間:2011-09-16 共1頁

  問題
  C語言的書籍的附錄都要說一個問題,就是優先性和結合方向。
  我的理解是這些是建立在表達式的基礎之上的,寫一個c語言的表達式或者看一個C語言的表達式,考試,提示先看優先性,在優先性相同的情況下,再根據結合方向,判斷表達式的那個部分先運算,那個后運算。如:
  1. a=b=c=0,只有一個=,因此優先性相同,因此看結合方向,結合方向是從右到左,因此,整個表達是從右開始計算,上面等價與a=(b=(c=0)),這是正確地,但是下面這個問題該怎么解釋哪?
  2. a=*p++;
  =,優先級低于*,++,也就是等價于a=(*p++);但是*p++,這個部分是怎么運算哪?寫過C的都知道*先,++后,可是在C語言附錄中,*(取地址),++是同優先級的,2級,結合方向是從右到左,按照這個理解就應該*(p++),這才是從右到左吧,不知道理解有沒有問題,但是這個和實際應用的相反的嘛?
  解答
  關于a = *p++;
  首先,“后自增”運算符的優先級是高于“*”的,“前自增”才跟“*”平級。這一點樓主沒有看仔細。
  然后,為什么優先級高于“*”,結果還是取出了原來的指針指向的內容呢?
  有很多書上說“后自增”是先“用”值,再加1,這種說法是很不嚴格很不確切的。正是這種不嚴格和不確切,才導致了許多初學者在*p++上絆倒。
  再看一個更簡單的例子:
  int i = 10;
  int j = i++;
  現在j等于多少?家都知道是10,問原因,很多人都會說是“在后自增的情況下,是先賦值再加1”。這中說法完全不負責任,賦值運算賦“=”的優先級比“后自增”低好幾個級別,怎么可能發生“先賦值”這樣的事?
  正確的語義解釋是:“前自增”和“后自增”都是先將變量加1,然后區別在于加1后返回值,后自增在加1后返回的是原來的,而前自增返回的是加1后新值。
  從效果上,i++相當于一個逗號表達式:“tmp = i, ++i, tmp”

百分百考試網 考試寶典

立即免費試用