2013-04-08 69 views
1

我有以下IF語句,我想不通這是什麼意思:如果條件有效,情況如何?

if (data->tokens.size()) 
{.. 
    //reads each token in a for loop and assigns each token to a variable... 
} 

令牌有它的六個值這麼tokens.size()應該返回,對不對?

我不明白爲什麼我們需要if條件嗎?據我所知,如果條件將是真的,如果tokens.size()返回和假如果它返回。

在我的情況下,它返回(或任何數量的令牌,可以是任何數字而不是0或1)。那麼如果條件有效,情況如何呢?

換句話說,我想知道如何,如果當它到達0以外,並在C和C值1

+6

Nitpick:'if'不是「循環」。 – 2013-04-08 10:36:45

+0

謝謝大家,我得到了答案。是的,如果不是一個循環,而是一個條件語句:) – detraveller 2013-04-08 10:43:35

+2

我可以建議你把它改成'if(!data-> tokens.empty()){...}'。它不那麼令人困惑(在某些情況下可能會稍微快一些,雖然在這裏這不是一個很好的理由)。 – BoBTFish 2013-04-08 10:48:38

回答

5

條件statemens手柄++都隱含有比較「不等於零」如果沒有別的給出。例如。 if (data->tokens.size())if (data->tokens.size() != 0)相同。

+0

所以這意味着如果我有一些令牌,那麼它接受if條件,並且只有當令牌爲空時,它纔會執行在if語句之後要執行的任何操作嗎? – detraveller 2013-04-08 10:41:09

+0

如果它不是空的(所以如果'size()'返回零以外的任何東西)。 – 2013-04-08 10:42:24

+0

是的。非常感謝! – detraveller 2013-04-08 10:44:25

0

我覺得這只是非emptyness的測試,以確保我們不會遍歷一個空載體

1

if需要真或假的布爾表達式,不是一個數字。對我們來說幸運的是,如果你給一個數字,它會被轉換成一個布爾值。如果數字爲0,則爲False,否則爲true,因此它將起作用。

0

它是有條件的不是循環。如果它是真的,那麼你輸入條件塊。如果它是零,那麼它是假的,它不會進入阻止。如果有任何其他值不是0,那麼它是真的,它進入塊。

0
if(data->tokens.size()) ~ if(data->tokens.size()!=0) 
+1

不,因爲如果'size()'返回-1或-31212128317981,它也是如此。 (從上下文來看,如果'size()'返回一個有符號或無符號的值是不可能的)。 – 2013-04-08 10:43:38

+0

如果它爲否定返回false會不會更好? – 2013-04-08 10:46:08

0

爲了更準確:在standard說:

6.4選擇語句

選擇語句:

if (condition) statement 

...爲條件的規則同時適用於選擇-statements和 forwhile陳述(6.5)。 ...在開關 聲明以外的聲明中初始化聲明的 條件的值是聲明變量上下文轉換的值 到bool(第4章)。如果該轉換不合格,則該程序爲 不合格。 ...作爲表達式的條件的值是表達式的 值,上下文轉換爲bool;如果 轉換不合格,則該程序不合格。

凡轉換到bool平均:

4標準轉換

某些語言結構需要一個表達式被轉換爲 一個布爾值。出現在這樣的背景下的表達式e據說 被上下文轉換爲bool和當且僅當 聲明bool t(e);是良好的形成,對於某些發明臨時 變量t(8.5)是良好的。

這很重要。這就是爲什麼你可以做這樣的「魔術」:

while(getline(cin,str))) cout<<str; 

與適用bool(cin)(在這種情況下getlinecin))

在您的例子轉換將是:

4.12布爾轉換[conv.bool]

1一個算術運算,非範圍枚舉,指針或指針的前值 t o成員類型可以轉換爲類型爲bool的預值。零值 值,空指針值或空成員指針值被轉換爲 爲false;任何其他值轉換爲true。對於 直接初始化(8.5),類型std::nullptr_t的預值可以被 轉換爲bool類型的預值;結果的值是false

就像旁邊的評論一樣,在你的例子中if幾乎是無用的,甚至只是混淆了代碼。試想一下:

for (int i=0; i< data->tokens.size(); ++i) 
{.. 
    //reads a token and assigns to a variable... 
} 

或:

for(const auto &token : data->tokens) 
    {.. 
     // assigns token to a variable... 
    } 

在這兩種情況下,該for將進入只有size()>0使多餘的if