C运算符优先级,a+中的逻辑与一元运算符+&&;b++;| |++;C
在下面的代码中C运算符优先级,a+中的逻辑与一元运算符+&&;b++;| |++;C,c,operator-precedence,C,Operator Precedence,在下面的代码中 int a = 1, b = 2, c = 3, d; d = a++ && b++ || c++; printf("%d\n", c); 输出为3,我得到或计算第一个条件,将其视为1,然后不考虑其他条件,但在c中,一元运算符的优先级高于逻辑运算符,就像在数学中一样 2 * 3 + 3 * 4 我们首先计算乘积,然后求和,来计算上面的表达式,为什么c不这样做呢?首先计算所有一元运算符,然后计算逻辑运算?请注意优先级与计算顺序的概念不同。&&和| |的特殊行为表
int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);
输出为3,我得到或计算第一个条件,将其视为1,然后不考虑其他条件,但在c中,一元运算符的优先级高于逻辑运算符,就像在数学中一样
2 * 3 + 3 * 4
我们首先计算乘积,然后求和,来计算上面的表达式,为什么c不这样做呢?首先计算所有一元运算符,然后计算逻辑运算?请注意优先级与计算顺序的概念不同。&&
和| |
的特殊行为表明,如果不必计算右侧,则根本不计算右侧。优先级告诉您如果对其进行评估,将如何对其进行评估
换句话说,优先级有助于描述如何解析表达式。但它并没有直接说明如何评估它。优先级告诉我们,解析您询问的表达式的方法是:
||
/ \
/ \
&& c++
/ \
/ \
a++ b++
但是,当我们去评估这个解析树时,&&
和|
的短路行为告诉我们,如果左侧决定了结果,我们根本不去右侧评估任何东西。在这种情况下,由于a++&&b++
是真的,|
操作符知道其结果将是1,因此它根本不会导致对c++
部分进行求值
这也是为什么条件表达式像
if(p != NULL && *p != '\0')
及
你很安全。在p
为空的情况下,第一个不会崩溃,也不会尝试访问*p
。如果n
为0,则第二个值不会除以0
评价的先后顺序很容易让人产生错误的印象。当我们有一个像
1 + 2 * 3
我们总是说“比+
更高的*
优先级意味着乘法首先发生”。但是如果我们加入一些函数调用,比如:
f() + g() * h()
这三个函数中哪一个将首先被调用?结果我们不知道。优先级并没有告诉我们这一点。编译器可以安排首先调用f()
,即使最后需要它的结果。另请参见。请认识到优先级与求值顺序的概念不同。&&
和| |
的特殊行为表明,如果不必计算右侧,则根本不计算右侧。优先级告诉您如果对其进行评估,将如何对其进行评估
换句话说,优先级有助于描述如何解析表达式。但它并没有直接说明如何评估它。优先级告诉我们,解析您询问的表达式的方法是:
||
/ \
/ \
&& c++
/ \
/ \
a++ b++
但是,当我们去评估这个解析树时,&&
和|
的短路行为告诉我们,如果左侧决定了结果,我们根本不去右侧评估任何东西。在这种情况下,由于a++&&b++
是真的,|
操作符知道其结果将是1,因此它根本不会导致对c++
部分进行求值
这也是为什么条件表达式像
if(p != NULL && *p != '\0')
及
你很安全。在p
为空的情况下,第一个不会崩溃,也不会尝试访问*p
。如果n
为0,则第二个值不会除以0
评价的先后顺序很容易让人产生错误的印象。当我们有一个像
1 + 2 * 3
我们总是说“比+
更高的*
优先级意味着乘法首先发生”。但是如果我们加入一些函数调用,比如:
f() + g() * h()
这三个函数中哪一个将首先被调用?结果我们不知道。优先级并没有告诉我们这一点。编译器可以安排首先调用
f()
,即使最后需要它的结果。另请参见。C
遵循man 1操作员
阅读。C
遵循man 1操作员
阅读。回答非常好!请注意,if(n==0 | | sum/n==0)
是不安全的,如果n
和sum
都是int
和sum==int\u MIN
和n==1
。回答得好!请注意,if(n==0 | | sum/n==0)
是不安全的,如果n
和sum
都是int
和sum==int\u MIN
和n==1
。