快捷方式要记住C中的评估顺序和优先级的优先级[英] Shortcut to remember the Order of Evaluation and Precedence of Operators in C

本文是小编为大家收集整理的关于快捷方式要记住C中的评估顺序和优先级的优先级的处理方法,想解了快捷方式要记住C中的评估顺序和优先级的优先级的问题怎么解决?快捷方式要记住C中的评估顺序和优先级的优先级问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

是否有任何快捷方式或最佳方式记住C BeaCause中的优先级和评估顺序,它扮演了主要角色,或者我(我们大多数人)通常会忘记并最终陷入混乱.请帮我....

我想为此举一个例子...说..

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++,如果我错了,请清除我,请向我解释一下.

推荐答案

首先,形式的表达a++ + ++a,++a + a++等,导致不确定的行为; 任何结果都是可能的.从语言标准( n1256))/p>

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;  

在这种情况下,将更新到a和b被推迟到添加和分配给x之后.

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

  1. 后缀运算符(全部都具有相同的优先级,因此将对操作员的序列进行评估)
    • 数组下标操作员[]
    • 功能调用操作员()
    • 组件选择运算符.和->
    • Postfix ++和--
  2. 单一操作员(都具有相同的优先级,因此将对操作员的序列进行评估)
    • 前缀++和--
    • sizeof
    • 位否定操作员~
    • 逻辑否定操作员!
    • 一单符号操作员-和+
    • 操作员地址&
    • 解雇操作员*
  3. cast表达式( 类型名称 )
  4. 乘法运算符*,/,%
  5. 加法运算符+和-
  6. Shift Operators <<和>>
  7. 关系运算符<,>,<=,>=
  8. 平等操作员==和!=
  9. 位和&
  10. 位XOR ^
  11. 位或|
  12. 逻辑和&&
  13. 逻辑或||
  14. 条件操作员?:
  15. 分配操作员=,+=. -=,*=,/=,%=,<<=,>>=,&=,&=,^=,|=
  16. 顺序(逗号)操作员,

因此,像*x++这样的表达式被解析为*(x++),因为后修正++具有比Unary *更高的优先级.同样,sizeof x + 1被解析为(sizeof x) + 1,因为sizeof的优先级高于添加.像p++->x这样的表达式被解析为(p++)->x; Postfix ++和->运算符具有相同的优先级,因此它们从左到右解析.

这大约与快捷方式所获得的短相似;如有疑问,请使用括号.

其他推荐答案

有一个快捷方式要记住C运算符的优先级.

puma是rebl(拼写" rebl",就像"叛逆").

" i" IS IS不代表任何操作员,并用于完成句子.

(注意:所有未指定关联性的操作员均向右到右).

p-主要

u -Unary

m-乘法

a-加法

s- shift

r-关系

e- equality

b- bitwise(&> ^> |)

l-逻辑(逻辑&&>逻辑||)

最后三个操作员是

t-三元

a-分配

c-逗号

(taco如( https://en.wikipedia.org/wiki/wiki/taco )t用于三元,用于分配的A和com for Comma).

除了一元,分配和三元外,所有的关联是 从右到右(右侧的自动骑行,即分配,Unary和Ternary是右至左).

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

其他推荐答案

确实喜欢优点:不确定时添加括号.然后,您不必记住,加上代码将更容易阅读.

本文地址:https://www.itbaoku.cn/post/358996.html