我知道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
。
为什么这里没有应用优先规则。逻辑运算符是否不受优先规则约束?如果有,还有哪些运营商表现出这样的行为?而这种行为背后的逻辑是什么?
您混淆了两个相关但不同的主题:运算符优先级和求值顺序。
运算符优先级规则规定了如何将各种运算符组合在一起。在此表达式的情况下:
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 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变