逗號運算符:,
允許對兩個語句進行分組,其中有一個是預期的。
expression , expression
備注
逗號運算符具有從左向右的關聯性。 由逗號分隔的兩個表達式將從左向右進行計算。 始終計算左操作數,并且在計算右操作數之前將完成所有副作用。
在某些上下文(如函數參數列表)中,逗號可用作分隔符。 不要將該逗號用作分隔符與將其用作運算符的情況混淆;這兩種用法完全不同。
考慮表達式
e1 , e2
該表達式的類型和值是 e2 的類型和值;e1 的計算結果將被丟棄。 如果右操作數是左值,則結果為左值。
在通常將逗號用作分隔符的方案中(例如,在函數或聚合初始值設定項的實參中),逗號運算符及其操作數必須包含在括號中。 例如:
func_one( x, y + 2, z );func_two( (x--, y + 2), z );
在上面的對 func_one 的函數調用中,會傳遞以逗號分隔的三個參數:x、y + 2 和 z。 在對 func_two 的函數調用中,圓括號強制編譯器將第一個逗號解釋為順序計算運算符。 此函數調用將兩個參數傳遞給 func_two。 第一個參數是順序計算運算 (x--, y + 2) 的結果,具有表達式 y + 2 的值和類型;第二個參數為 z。
示例
// cpp_comma_operator.cpp#include <stdio.h>int main () { int i = 10, b = 20, c= 30; i = b, c; printf("%i/n", i); i = (b, c); printf("%i/n", i);}
2030
條件運算符:? :
語法
expression ? expression : expression
備注
條件運算符 (? :) 是一個三元運算符(采用三個操作數)。條件運算符按以下方式運行:
第一個操作數隱式轉換為 bool。計算該操作數,并在繼續前完成所有副作用。
- 如果第一個操作數的計算結果為 true (1),則計算第二個操作數。
- 如果第一個操作數的計算結果為 false (0),則計算第三個操作數。
- 條件運算符的結果是操作數(無論是第二個還是第三個)的計算結果。只有最后兩個操作數之一在條件表達式中計算。
- 條件表達式具有從右到左的關聯性。第一個操作數必須是整數或指針類型。以下規則適用于第二個和第三個操作數:
- 如果兩個操作數是相同的類型,則結果也是該類型。
- 如果兩個操作數都是算術或枚舉類型,則執行常用算術轉換(在算術轉換中有述)來將它們轉換為通用類型。
- 如果兩個操作數都是指針類型,或者一個是指針類型,另一個是計算結果為 0 的常量表達式,則執行指針轉換來將它們轉換為通用類型。
- 如果兩個操作數都是引用類型,則執行引用轉換來將它們轉換為通用類型。
- 如果兩個操作數都是 void 類型,則通用類型是 void 類型。
- 如果兩個操作數是相同的用戶定義類型,則通用類型也是該類型。
- 如果操作數是不同的類型,而且至少有一個操作數是用戶定義類型,則使用語言規則來確定通用類型。(請參閱下面的警告。)
前面列表中沒有的第二個和第三個操作數的任意組合都是非法的。結果的類型是通用類型,如果第二個和第三個操作數是同一類型且都是左值,則結果為左值。
System_CAPS_warning警告
如果第二個和第三個操作數的類型不相同,則會按 C++ 標準中的指定調用復雜類型轉換規則。這些轉換可能會導致意外行為,包括構造和析構臨時對象。為此,我們強烈建議:(1) 避免將用戶定義的類型用作帶條件運算符的操作數;(2) 如果確實要使用用戶定義的類型,務必將每個操作數顯式轉換為通用類型。
// expre_Expressions_with_the_Conditional_Operator.cpp// compile with: /EHsc// Demonstrate conditional operator#include <iostream>using namespace std;int main() { int i = 1, j = 2; cout << ( i > j ? i : j ) << " is greater." << endl;}