是否有任何捷径或最佳方式来记住C中的优先级和评价顺序,因为它起主要作用,而我或(我们大多数人)通常会忘记并最终得到混乱.请帮我....
我想举个例子...说..
void main()
{
int a=1;
a = a++ + ++a;
printf("%d",a);
}//prints 5;
void main()
{
int a=1;
int x;
x = a++ + ++a;
printf("%d",x);
}//prints 4;
Run Code Online (Sandbox Code Playgroud)
表达式也
x = ++a + a++;
给出了不同的结果
我希望如果后期增量具有高优先级,那么a++应该首先评估,如果我错了请告诉我,请解释我是如何工作的..
Joh*_*ode 20
首先,形式的表达a++ + ++a,++a + a++等等,导致未定义的行为 ; 任何结果都是可能的.从语言标准(n1256):
6.5表达式
...
2在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算修改一次.72)此外,先前值应只读以确定要存储的值.73)
...
72)浮点状态标志不是对象,可以在表达式中多次设置.
73)此段落呈现未定义的语句表达式,如i = ++i + 1; a[i++] = i;允许的同时i = i + 1; a[i] = i;
所以,不要这样做.
一个定义良好的表达式x = a++ + ++b将被解析为x = ((a++) + (++b)); 两种形式的++运算符都具有比加法更高的优先级,并且加法具有比赋值更高的优先级.表达式的结果将是相同的x = a + (b + 1).
其次,请记住++和--运算符有结果和副作用,如下所示:
Expression Result Side effect
---------- ------ -----------
i++ i i = i + 1
++i i + 1 i = i + 1
i-- i i = i - 1
--i i - 1 i = i - 1
需要记住的重要注意事项:评估表达式后不必立即应用副作用; 它只需要在下一个序列点之前应用.这是可能的x = a++ + ++b,以评估如下:
t1 = a;
t2 = b + 1;
x = t1 + t2;
b = b + 1;
a = a + 1;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,更新a和b推迟到添加和分配之后x.
就优先顺序而言,这是从高到低的一般顺序:
[]
()
.和->
++和--
++和--
sizeof
~
!
-和+
&
*
( 类型名称 )
*,/,%
+和-
<<和>>
<,>,<=,>=
==和!=
&
^
|
&&
||
?:
=,+=.-=,*=,/=,%=,<<=,>>=,&=,^=,|=
,
因此,表达式*x++被解析为*(x++),因为后缀++具有比一元更高的优先级*.同样,sizeof x + 1被解析为(sizeof x) + 1,因为sizeof优先级高于加法.像这样的表达式p++->x被解析为(p++)->x; 后缀++和->运算符都具有相同的优先级,因此它们从左到右进行解析.
这与快捷方式一样短; 如有疑问,请使用括号.
bar*_*tal 13
有一个记住C运算符优先级的快捷方式.
PUMA是REBL(拼写"REBL"就像"REBEL").
IS中的"I"不代表任何操作符并用于完成句子.
(注意:未指定关联性的所有运算符都是从左到右).
P - 小学
你 - 一元
M - 乘法
A - 添加剂
S-Shift
R-关系
E-平等
B-BitWise(&> ^> |)
L-逻辑(逻辑&&>逻辑||)
最后三个运营商是
T-三元
A-作业
C-逗号
(TACO如(https://en.wikipedia.org/wiki/Taco)T for Ternary,A for for assignment and Co for Comma).
对于协会除了一元,任务和三元之外都是从左到右(自动骑在右边,即任务,一元和三元从右到左).
建议查看评论以获取更多信息.