2014-01-17 74 views
7

標題有點模糊,因爲我真的不知道如何定義這個問題。這個C語句的順序是否定義良好?

它做下面的代碼:

for (match   = root, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length; 

    match != NULL; 

    match   = match->next, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length) 
{ 
    if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base) 
     break; 
    // other stuff... 
} 

是語句for循環保證按順序運行?

例如,m_matchBase = match->requestedBase保證在match = match->next之後運行?

+1

是的,這是保證,[進一步的信息](http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) –

+0

http://stackoverflow.com/questions/52550/what -does-the-operator-do-in-c#52558 – clcto

+0

這是C還是C++?選一個。既然你在標題中只提到了「C」,現在我將假設你的意思是你所說的,並且我會適當地編輯你的標籤。 –

回答

8

是的,逗號運算符(這裏使用的是什麼)將對運算進行排序。這意味着當match->next變爲null時,你的循環很可能會崩潰。

+2

不錯的趕上與崩潰 – bolov

+0

好抓!謝謝 –

2

是的。

逗號運算符的左操作數被評估爲void表達式;在它的評估和右操作數的評估之間有一個 序列點。然後評估右邊的 操作數;結果有它的類型和價值。

&&運算符也有一個序列點。

3

是的,見C++ 11標準(5.18):

一對由逗號分隔的表達式求值左到右;左表達式是一個discarded- 值表達式

5

表達式從左至右並且會有各評價後序列點進行評價。在Ç語法用於for語句不脫離草案聲明C99標準部6.8.5迭代語句是:

爲(表達選擇;表達選擇;表達 opt)statement

因此,0123每一組表達式中的將是一個comma operator而不僅僅是一個分隔符,這意味着分配將從左到右進行評估。這在部分覆蓋6.5.17逗號運算符它說:

逗號操作者的左操作數作爲空隙表達式求值;評估後有一個 序列點。然後評估右操作數;結果有它的類型和價值

這是否是可維護的代碼是另一個問題,但要注意的是,當match>next回報NULL您將在隨後的子表達式來調用undefined behavior。這可能會用某種方式來證明這是一種糟糕的選擇,因爲很容易錯過並難以檢查當前的形式。

相關問題