当前位置: 首页 > 知识库问答 >
问题:

C语言中的短路与操作员优先

封瑞
2023-03-14

我知道C中的逻辑运算符遵循短路,但我怀疑的是短路和运算符优先规则并不是相互对立的。参见下面的示例:

#include<stdio.h>
int main()
{
    int a;
    int b=5;

    a=0 && --b;
    printf("%d %d",a,b);

    return 0;
}

根据优先级规则,最高优先级为前缀运算符的优先级。因此,应首先计算--b,然后计算&,最后将结果分配给A。因此预期输出应为0 4。但在本例中,&的第二个操作数从未实际执行,结果是0 5

为什么这里没有应用优先规则。逻辑运算符是否不受优先规则约束?如果有,还有哪些运营商表现出这样的行为?而这种行为背后的逻辑是什么?

共有1个答案

杜弘伟
2023-03-14

您混淆了两个相关但不同的主题:运算符优先级和求值顺序。

运算符优先级规则规定了如何将各种运算符组合在一起。在此表达式的情况下:

 a=0 && --b;

操作符按如下方式分组:

 a = (0 && (--b));

因此,在本例中,计算&的左侧,即0;因为它是0,所以不计算-b的右侧,因此不增加b

下面是运算符优先级和求值顺序之间区别的另一个例子。

int val()
{
    static x = 2;
    x *= 2;
    return x;
}

int main()
{
    int result = val() + (5 * val());
    printf("%d\n", result);
    return 0;
}

上面的程序会打印什么?事实证明,有两种可能性,而且都是成立的。

val() + (5 * val())
 类似资料:
  • 我理解下面的区别(至少对于Java): 但我的问题是,当你在处理布尔表达式时,有没有理由使用非短路运算符?是否有一些性能上的好处或使用不会被认为是坏的练习?

  • 在JavaScript和Java中,equals运算符(或)的优先级高于or运算符()。但这两种语言(JS、Java)都支持语句中的短路: 现在,根据操作员的优先级,不应该发生短路,就优先级而言,=

  • 我们不会在C编程语言中看到广度优先遍历(或广度优先搜索)的实现。 出于参考目的,我们将遵循我们的示例并将其作为我们的图形模型 - 用C实现 (Implementation in C) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX 5 struct Vertex { char label;

  • 我们不会在C编程语言中看到Depth First Traversal(或Depth First Search)的实现。 出于参考目的,我们将遵循我们的示例并将其作为我们的图形模型 - 用C实现 (Implementation in C) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX 5 struct

  • 指针运算符加减标签操作 指针作为一种特殊的变量,它的运算和普通变量是有一定区别的。指针在运算中并没有具备其它变量所有的性能。我们只是给大家介绍一些指针常用的运算: 加法运算(+,++) 我们知道一个整型的变量可以为它做加法运算,那么指针变量加1之后是一个地址还是一个整型? int *p=xxx; [0x12] //有一个int类型的指针,它的指针变量存储的地址为0x12。 p=p+1; 由于p是

  • 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变