Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C运算符优先级,a+中的逻辑与一元运算符+&&;b++;| |++;C_C_Operator Precedence - Fatal编程技术网

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