author: selfimpr
blog: http://blog.csdn.net/lgg201
mail: [email protected]
閱讀<C陷阱與缺陷>, 看到書中對優先級記憶的精彩講解, 總結下表.
另由於是php程序員, 所以對php的對應優先級做類似分析.
最後是用php和c中的?:結合性的不同解釋"結合性"的問題.
不正確的地方請各位指出.
* C語言運算符優先級(共計15個等級)
1. 非運算符(函數調用, 複合數據結構取元素): "()", "[]", "->", "."
2. 單目運算符: "!", "~", "++", "--", "-", "(type)"(類型轉換), "*", "&", "sizeof"
3. 雙目運算符:
1) 算術運算符:
a) 乘除: "*", "/", "%"
b) 加減: "+", "-"
2) 移位運算符: "<<", ">>"
3) 關係運算符:
a) 大小比較: "<", "<=", ">", ">="
b) 相等比較: "==", "!="
4) 邏輯運算符:
a) 按位邏輯運算符:
* 按位與: "&"
* 按位異或: "^"
* 按位或: "|"
b) 順序邏輯運算符:
* 短路與: "&&"
* 短路或: "||"
4. 三目運算符: "?:"
5. 賦值運算符: "=", "*=", "/=", "%=", "+=", "-=", ...等等
6. 逗號運算符: ","
* C語言運算符結合性:
1. 右結合: 單目運算符, 三目運算符, 賦值運算符
2. 左結合: 第一條未列出所有運算符爲左結合
* php運算符優先級(共計22個等級)
1. 非運算符(複合數據結構取元素, 特殊運算符):
1) 對象創建: "clone", "new"
2) 取複合結構元素: "[]"
2. 單目運算符:
1) 自增自減: "++", "--"
2) 類型轉換, 錯誤抑制符, 取反運算符, 負號: "(type)"(類型轉換), "@", "~", "-"
3) 類型判定符: "instanceof"
4) 邏輯非: "!"
3. 雙目運算符:
1) 算術運算符:
a) 乘除: "*", "/", "%"
b) 加減: "+", "-"
2) 移位運算符: "<<", ">>"
3) 關係運算符:
a) 大小比較: "<", "<=", ">", ">="
b) 相等比較: "==", "!=", "===", "!=="
4) 邏輯運算符:
a) 按位邏輯運算符:
* 按位與: "&"
* 按位異或: "^"
* 按位或: "|"
b) 順序邏輯運算符:
* 短路與: "&&"
* 短路或: "||"
4. 三目運算符: "?:"
5. 賦值運算符: "=", "*=", "/=", "%=", "+=", "-=", ...等等
6. 低優先級邏輯運算符:
* 與: "and"
* 異或: "xor"
* 或: "or"
7. 逗號運算符: ","
* php運算符結合性:
1. 無結合性: 對象創建, 自增自減, 類型判定符, 關係運算符
2. 右結合: 第一條中沒有列出的單目運算符, 賦值運算符
3. 左結合: 前面兩條未列出的所有運算符均爲左結合
* C語言和PHP中的三目運算符結合性差異比較
1. C語言中"?:"爲右結合
2. php中"?:"爲左結合
3. 實例: printf("%d\n", 1 ? 2 : 3 ? 4 : 5);
1) C語言中解析: 先運算最後一個"?:"
printf("%d\n", 1 ? 2 : (3 ? 4 : 5));
/* 結果: 2 */
2) php中解析: 先運算第一個"?:"
printf("%d\n", (1 ? 2 : 3) ? 4 : 5);
/* 結果: 4 */