您的位置:首页 > 编程语言 > C语言/C++

[快速记忆]C语言/php的运算符优先级(结合性)

2013-02-21 17:00 267 查看
可以解决困惑!

PHP : $a = 12;

$b = $a-- - --$a; // 2

C : int a=12 ,b;

b = a-- - --a; //0

阅读<C陷阱与缺陷>, 看到书中对优先级记忆的精彩讲解, 总结下表.

另由于是php程序员, 所以对php的对应优先级做类似分析.

最后是用php和c中的?:结合性的不同解释"结合性"的问题.

不正确的地方请各位指出.

[cpp] view
plaincopy

* 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);

/* 结果: 4 */

2) php中解析: 先运算第一个"?:", 将第一个:之后的表达式看作整体

printf("%d\n", 1 ? 2 : (3 ? 4 : 5));

/* 结果: 2 */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: