记住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; 

在这种情况下,对ab的更新将推迟到添加和赋值给x

就优先顺序而言,这里是从高到低的一般顺序:

  1. 后缀运算符(都具有相同的优先级,因此将从左到右对运算符序列进行求值)
    • 数组下标运算符[]
    • 函数调用运算符()
    • 组件选择运算符.->
    • 后缀++--
  2. 一元运算符(都具有相同的优先级,因此将从左到右评估运算符序列)
    • 前缀++--
    • sizeof
    • 按位否定运算符~
    • 逻辑否定运算符!
    • 一元符号运算符-+
    • 运营商地址&
    • 解除引用运算符*
  3. 转换表达式( 类型名称 )
  4. 乘法运算符*/%
  5. 添加剂运算符+-
  6. 移位运算符<<>>
  7. 关系运算符<><=>=
  8. 平等运营商==!=
  9. 按位AND &
  10. 按位XOR ^
  11. 按位OR |
  12. 逻辑AND &&
  13. 逻辑OR ||
  14. 条件运算符?:
  15. 赋值运算符=+=-=*=/=%=<<=>>=&=^=|=
  16. 顺序(逗号)运算符,

因此,像*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链接在此输入链接描述