记住C语言中运算符的评估顺序和优先顺序的捷径

jac*_*ack 13 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;  
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)

在这种情况下,更新ab推迟到添加和分配之后x.

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

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

因此,表达式*x++被解析为*(x++),因为后缀++具有比一元更高的优先级*.同样,sizeof x + 1被解析为(sizeof x) + 1,因为sizeof优先级高于加法.像这样的表达式p++->x被解析为(p++)->x; 后缀++->运算符都具有相同的优先级,因此它们从左到右进行解析.

这与快捷方式一样短; 如有疑问,请使用括号.


Joh*_*ski 15

喜欢专业人士:当你不确定时添加括号.然后你不必记住,加上代码将更容易阅读.


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).

对于协会除了一元,任务和三元之外都是从左到右(自动骑在右边,即任务,一元和三元从右到左).

建议查看评论以获取更多信息.

  • 所以,更像是 PUMA 的 REBL TAC(puma 是一只猫,因为我们的猫是拼写反叛者,所以它把“cat”写反了)。如果有一个快捷方式来记住“逻辑 &amp;&amp; &gt; 逻辑 ||”,我会很高兴的 部分。 (3认同)