记住C中运算符的评估顺序和优先顺序的快捷方式
是否有任何捷径或最佳方式来记住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;
也是表达
x = ++a + a++;
给出了不同的结果
我希望如果后期增量具有高优先级,则应首先评估a++
,如果我错了请清除我,请解释我的工作原理。
首先,formsa++ + ++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))
; 两种forms的++
运算符都具有比加法更高的优先级,并且加法具有比赋值更高的优先级。 表达式的结果与x = a + (b + 1)
。
其次,请记住++
和--
运算符有结果和副作用 ,如下所示:
表达结果副作用 ---------- ------ ----------- i ++ ii = i + 1 ++ ii + 1 i = i + 1 我 - ii =我 - 1 --ii - 1 i = i - 1
需要记住的重要注意事项:评估表达式后不必立即应用副作用; 它只需要在下一个序列点之前应用。 x = a++ + ++b
可以按如下方式进行评估:
t1 = a; t2 = b + 1; x = t1 + t2; b = b + 1; a = a + 1;
在这种情况下,对a
和b
的更新将推迟到添加和赋值给x
。
就优先顺序而言,这里是从高到低的一般顺序:
- 后缀运算符(都具有相同的优先级,因此将从左到右对运算符序列进行求值)
- 数组下标运算符
[]
- 函数调用运算符
()
- 组件选择运算符
.
和->
- 后缀
++
和--
- 数组下标运算符
- 一元运算符(都具有相同的优先级,因此将从左到右评估运算符序列)
- 前缀
++
和--
-
sizeof
- 按位否定运算符
~
- 逻辑否定运算符
!
- 一元符号运算符
-
和+
- 运营商地址
&
- 解除引用运算符
*
- 前缀
- 转换表达式
(
类型名称)
- 乘法运算符
*
,/
,%
- 添加剂运算符
+
和-
- 移位运算符
<<
和>>
- 关系运算符
<
,>
,<=
,>=
- 平等运营商
==
和!=
- 按位AND
&
- 按位XOR
^
- 按位OR
|
- 逻辑AND
&&
- 逻辑OR
||
- 条件运算符
?:
- 赋值运算符
=
,+=
。-=
,*=
,/=
,%=
,<<=
,>>=
,&=
,^=
,|=
- 顺序(逗号)运算符
,
因此,像*x++
这样的表达式被解析为*(x++)
,因为后缀++
优先级高于一元*
。 类似地, sizeof x + 1
被解析为(sizeof x) + 1
,因为sizeof
具有比加法更高的优先级。 像p++->x
这样的表达式被解析为(p++)->x
; postfix ++
和->
运算符具有相同的优先级,因此它们从左到右进行解析。
这与快捷方式一样短; 如有疑问,请使用括号。
喜欢专业人士:当你不确定时添加括号。 然后你不必记住,加上代码将更容易阅读。
有一个记住C运算符优先级的快捷方式。
PUMA是REBL(拼写“REBL”就像“REBEL”)。
IS中的“I”不代表任何操作符并用于完成句子。
(注意:所有未指定关联性的运算符都是从左到右)。
P – 小学
你 – 一元
M – 乘法
A – 添加剂
S-Shift
R-关系
E-平等
B- BitWise(&> ^> |)
L-逻辑(逻辑&&>逻辑||)
最后三个运营商是
T-三元
A-作业
C-逗号
对于协会所有除了一元,作业和三元都是从左到右(自动骑在右边,即作业,一元和三元从右到左)。
建议查看有关PUMA全文的评论。
如果您发现它令人困惑,那么任何人都会阅读您的代码。 如有疑问,请使用括号来强调。
我同意其他post,总是尝试使用括号。 但是,如果您不想,请在此处将其打印出来并将其粘贴在您的计算机旁边。
- C运算符优先级表
当涉及运算符优先级时,您不应该依赖于您的记忆。 只有在明显的情况下。 这是 – 算术运算符的优先级,+ – * /%。 它也知道++和 – 具有比*更高的优先级,以便能够正确读取像*p++ = *q++;
这样的表达式*p++ = *q++;
按位运算具有疯狂的优先级规则。 总是使用括号。
要学习运算符优先级,请尝试:1:ARLA表示:A->算术运算符R->关系运算符L->逻辑运算符A->赋值运算符2:BODMAS B =括号((,))O =顺序(如幂)和=等等,)D =除(()M =乘(*)A =加(+)S =减法( – )
它是简单的计算当你写int a = 1; x = a ++ + ++ a; 由于前缀增量运算符(在++ a中),’a’的值将等于2因此当前表达式等于x = 2 + 2; // x = 4一旦控制转到下一行,由于后缀运算符,a的值增加1,现在a = 3
现在检查这个语句int a = 1; a = a ++ + ++ a; 在如上所述的该陈述中,’a’的值将等于表达式a = 2 + 2;。 //表示a = 4但是由于后缀增量运算符(a ++),一旦控制转移到程序中的下一行,a的值就会增加1。 因此printf(%d,a); 打印5我希望这会清除你的怀疑
在C中,优先级表指定表达式的评估顺序,并指定关联规则。 使用该规则,我们可以在表达式中评估相等优先级运算符(R-> L OR L-> R)。
你指定,
a = 1;
x = a ++ + ++ a;
1:++ a then exp:a(2)++ + 2 = 4赋值给x
2:然后增加a,变为a = 3
假设,a = a ++ + ++ a; 然后
增加一个
2 + 2分配给(4)。 增加a(5)。
Promod的答案或他的解释是不正确的
要记住的正确方法是
在所有pre运算符中,pre increment具有最高优先级
并且在所有后增量操作中 – 后续增量具有最小优先级
加法的优先级低于前后增量运算符
现在考虑Pre增量属于从右到左的类别这一事实
而后增量则属于从左到右的等级
考虑到这两种情况,可以计算出代码
i = 1; i=i++ + ++i + ++i + i++;
不是14而是12
中间两个表达式被评估为4然后4 + 4 + 4
“后缀增量/减量具有高优先级,但操作数的实际增量或减量被延迟(在语句完成执行之前的某个时间完成)。”
这是certificate链接在此输入链接描述