2012-03-15 63 views
0

考慮下面的代碼:++返回表達式用C

float validateEntry() 
{ 
    string entry; 
    float value; 

    getline(cin, entry); 
    value = atof(entry.data()); 

    return ((isNumber(entry) && value >= 0) ? i 
    : (cout << "Enter valid amount: ", validateEntry()) 
} 

爲什麼最後一行(逗號分隔的表達)允許的,以及是否有可與在C++ return語句可以使用其他表達式?

我在使用逗號的大多是疑惑,想知道這個表達式語法定義(我不知道它的存在,我也不會知道在哪裏可以找到)。我能用無限多的代碼填充最後一個表達式嗎?如果是的話,有什麼限制,要求等?

+2

爲什麼你認爲它不應該被允許的? – 2012-03-15 00:43:18

+0

順便說一下三元運算符'? :'不是'if'的簡寫。 'if'允許有條件地執行代碼(任何代碼)。三元運算符**根據條件返回**兩個值之間的一個值。 – 2012-03-15 00:45:10

+0

對不起,一個完全不正確的標題,因爲我發佈之前忘了修改它。 – skippr 2012-03-15 00:47:00

回答

1

逗號操作符可以讓您兩組否則無關的表情。兩個表達式總是被評估,結果是第二個表達式的結果。使用它幾乎總是一個糟糕的主意(因爲它只是爲了保存一行代碼而傷害可讀性),除了可能在for循環的頂部。

+0

啊,COMMA OPERATOR。現在一切都說得通了。我不知道我的問題最初在哪裏,因爲我不知道操作員是否存在。這導致我:http://stackoverflow.com/questions/54142/c-comma-operator – skippr 2012-03-15 01:12:43

0

,是一個運算符,就像+<<一樣,所以幾乎可以在任何需要表達式的地方使用它。例外情況是逗號需要具有不同含義的上下文,例如在函數調用中。在這樣的背景下,你必須通過添加一組額外的括號中的歧義逗號:

foo((b,c)); // call foo with a single argument 

告訴你的語句是等價的:

// return ((isNumber(entry) && value >= 0) ? i : (cout << "Enter valid amount: ", validateEntry()) 

if(isNumber(entry) && value >= 0) { 
    return i; 
} else { 
    cout << "Enter valid amount: "; 
    return validateEntry(); 
} 

這只是一個「聰明」有條件執行的方式在cout << "Enter valid amount: "之前,同時使用盡可能少的線路儘可能調用validateEntry()。當然,整個功能只是一種「聰明」的方式,可以反覆詢問輸入,直到獲得有效的輸入。 IMO的循環會比遞歸更好。

0

? :是C++

其語法的唯一三元opeartor是logical-or-expression ? expression : conditional-expression

可以進一步瞭解它在MSDN

1
return [expression]; 

expression : 
    expression , expression 
    literal 
    etc... 

逗號操作符在一行分隔的多個表達式。當用於類似return語句的賦值語句(賦值返回的臨時值)時,只分配最右邊的值。前面的表達式從左到右執行。在你的例子中,返回最終的函數調用返回值。

我使用這種技術來清除故障的正式參數變量。尤其是COM例程出現故障。例如:

HRESULT func(..., IInterface **ppv) 
{ 
... 
If(!good) 
    return (*ppv = 0), E_FAIL; 
... 
}