2013-06-28 90 views

回答

10

s2[ i ]將被分配到s1[ i ]然後將s1[ i ]的值與ZERO進行比較。

refer here瞭解更多信息。

+1

不是'NULL',零。 – unwind

+0

@unwind謝謝,我將NULL編輯爲零。 –

+1

談到標準合規時,永遠不要信任Microsoft文檔。 – Lundin

4

在你的語言,但它確實不相等時與s1[ i ]檢查,但在下面的序列中,

    s1[i] s2[i]s1[i]
  1. 檢查值與\0
  2. 返回10
  3. 分配值基於步驟2
4

分配的返回分配的值表達:

的表達式的值是左操作數的值的分配 完成後。

因此,當您有:

(s1[ i ] = s2[ i ]) != '\0'

然後你的分配的值(這是s1[i])比較'\0'

3

不等式首先進行賦值(s1[i] = s2[i]),然後檢查s1[i]是不是'\0'

我假定它是在一個,如果這樣:

if ((s1[i] = s2[i]) != '\0') 
    ;// Do things 

相當於:

s1[i] = s2[i]; 
if (s1[i] != '\0') 
    ;// Do things 
1

運算符優先爲了評價決定了表達的評價程序。

運算符優先級,用於解釋表達式的狀態,即哪些運算符屬於哪個運算對象。它類似於數學優先級,例如,1+1*2是3而不是4,因爲*的優先級高於+。由於該優先規則,表達式被評估爲1+(1*2)

評估順序與優先順序不同。它規定了評估子表達式的順序。另一個數學例子:我們知道(1*1) + (1+1)總是3。但是當我們計算出來的時候,我們可以決定先從左括號開始,或者我們可以從正確的開始。運營商的優先級並不決定我們從哪一個開始。儘管*的優先級高於+,但我們可以先開始計算右側表達式,但不會影響結果。

但編程時,這種評估順序通常很重要。編譯器是決定這個順序的人。並且爲了使事情變得複雜,可以按照個案的情況進行操作,而不必記錄(「未指定的行爲」)。


  • ()運算符的優先級最高,所以(s1[i] = s2[i])將得到首次評估。它裏面的一切都是一個子表達式。
  • 在()子表達式中,[]運算符具有下一個優先級,所以接下來計算兩個「s[i]」。請注意,「s[i]」也是子表達式,並且由於未指定子表達式的評估順序,因此編譯器可自由在s2[i]之前或之後評估s1[i]

    在這種特定情況下,首先評估哪一個最有可能無關緊要。

  • 在()子表達式中,接下來是=運算符。操作數s2[i]的內容被複制到s1[i]

  • 現在評估()中的所有表達式,我們得到結果,存儲在s1[i]中。
  • 最後,子表達式的結果是表達式剩餘運算符的一個操作數:!=。另一個操作數是字符文字'\0'
+0

+1解釋如何和爲什麼.. –