算子优先与评价顺序
int a=1; // Line 1a = a++ + ++a; // Line 2printf("%d",a); // Line 3
Line 2
在计算&(逻辑和)、欧元(逻辑OR)和逗号运算符的左操作数和右操作数之间。例如,在表达式中 *p++ != 0 && *q++ != 0
,子表达式的所有副作用 *p++ != 0
在尝试访问之前已完成。 q
.
在计算三元“问号”运算符的第一个操作数和第二个或第三个操作数之间。例如,在表达式中 a = (*p++) ? (*p++) : 0
之后有一个序列点。 *p++
,这意味着在执行第二个实例时,它已经增加了。
在一个完整表达式的结尾。此类别包括表达式语句(例如赋值)。 a=b;
)、返回语句、if、Switch、while或do-while语句的控制表达式以及for语句中的所有三个表达式。
在函数调用中输入函数之前。未指定计算参数的顺序,但此顺序点意味着在输入函数之前,它们的所有副作用都已完成。在表达中 f(i++) + g(j++) + h(k++)
,f
的原始值的参数调用。 i
,但是 i
在进入 f
..同样, j
和 k
在输入前更新 g
和 h
分别。但是,它没有按哪个顺序指定。 f()
,g()
,h()
被执行,也不按哪个顺序执行 i
,j
,k
都是递增的。的价值 j
和 k
在…的身体里 f
因此是没有定义的。 3注意,函数调用 f(a,b,c)
的逗号运算符和计算顺序的使用。 a
,b
,和 c
没有具体说明。
在函数返回时,将返回值复制到调用上下文中。(这个序列点仅在C+标准中指定;它仅隐式地存在于C中。)
在初始化器的末尾;例如,在声明中计算5之后 int a = 5;
.
在一个完整表达式的结尾。此类别包括表达式语句(例如赋值a=b;)、返回语句、if、Switch、while或do-while语句的控制表达式,以及for语句中的所有三个表达式。
Line 2
int x=10,y=1,z=2; // Line 4int result = x<y<z; // Line 5
Line 5
result
1
.
x<y<z
Line 5
x<(y<z)
(x<y)<z
result
0
result
1
Operator Precedence
Equal/Same
- Associativity
(x<y)<z
.
C算子的优先级和结合性影响表达式中操作数的分组和求值。只有当其他优先级较高或较低的运算符存在时,运算符的优先级才是有意义的。首先计算具有高优先级运算符的表达式。优先级也可以用“绑定”一词来描述。具有较高优先级的运算符据说具有更紧密的绑定。
它提到“先计算具有较高优先级运算符的表达式”。
()
x<y<z
(x<y)<z
<
此页面按优先级(从最高到最低)列出C运算符。它们的结合性指示在表达式中应用优先级相等的操作符的顺序。
int result=x<y<z
x
, y
z
x
, y
, z
10
, 1
2
x<y<z
10<1<2
.
10<1
1<2
int myval = ( printf("Operator\n"), printf("Precedence\n"), printf("vs\n"),printf("Order of Evaluation\n") );
comma
left-to-right
printf()
myval
.
撒科打诨
哈士奇WWW