Kra*_*ash 0 c operator-precedence
在以下代码中,
int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)
输出将是3,我得到或评估第一个条件,将其视为1,然后不关心其他条件,但在c中,一元运算符的优先级高于逻辑运算符,就像在数学中一样
2 * 3 + 3 * 4
Run Code Online (Sandbox Code Playgroud)
我们首先评估产品然后求和来评估上述表达式,为什么不做同样的事情呢?首先评估所有一元运算符,然后是逻辑事物?
请认识到,优先是不一样的概念,作为评价的顺序.特殊行为&&并||表示,如果没有必要,右侧不会被评估.Precedence会告诉您如何评估它的评估方式.
换句话说,优先级有助于描述如何解析表达式.但它没有直接说明如何评估它.优先级告诉我们解析您询问的表达式的方法是:
||
/ \
/ \
&& c++
/ \
/ \
a++ b++
Run Code Online (Sandbox Code Playgroud)
但是当我们去评估这个解析树时,它的短路行为&&并||告诉我们如果左侧确定了结果,我们就不会走右边并评估任何东西.在这种情况下,由于a++ && b++是真的,||操作员知道其结果将是1,因此它根本不会导致c++部件被评估.
这也是条件表达式的原因
if(p != NULL && *p != '\0')
Run Code Online (Sandbox Code Playgroud)
和
if(n == 0 || sum / n == 0)
Run Code Online (Sandbox Code Playgroud)
很安全.*p在pNULL为空的情况下,第一个不会崩溃,不会尝试访问.如果n为0 ,则第二个不会除以0.
很容易得到错误的印象,优先顺序和评价顺序.当我们有一个表达式
1 + 2 * 3
Run Code Online (Sandbox Code Playgroud)
我们总是说" *超越的优先级+意味着乘法首先发生".但是,如果我们抛出一些函数调用,如下所示:
f() + g() * h()
Run Code Online (Sandbox Code Playgroud)
这三个函数中的哪一个将首先被调用?事实证明我们不知道.优先权并没有告诉我们.编译器可以安排首先调用f(),即使最后需要它的结果.另见这个答案.
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |