C语言 && 运算符不是比 || 运算符优先级高么?为什么我这是同级别,求解,谢谢!

如题所述

第1个回答  2015-10-11
虽然||比&&优先级高,但是n=...这条语句的作用是1和后面的结果相或,1代表真,所以||后面的值不需要再计算了,因此ijk取原来的值,故得此结果!追答

我不小心写错了

虽然||比&&优先级低,但是n=...这条语句的作用是1和后面的结果相或,1代表真,所以||后面的值不需要再计算了,因此ijk取原来的值,故得此结果!

追问

这是咋回事?

可是按理说先执行&&再执行||,而且我刚才试了去掉n =了,还是一样的

这是咋回事?

追答

这是C的特性,在进行或运算时,只要前面的结果为真,后面的运算就是多余的了,没必要再做了

真 or 真 =真
真 or 假 =真
后面的值不影响结果,再做后面的操作纯粹浪费时间!这是C的巧妙之处

追问

那我将1改成0,它后面进行运算了唉,

n=后面的1

追答

非常正确!把1改为0,就进行后面计算

0表示假,它要进行后面计算,才知真假。

如果前面已经为真,就没有必要多此一举

追问

可是我想问的是 &&运算符不是优先于||运算符么?那按理说我我改成1最先运行的也不应该是||运算符啊,而是先运算&&俩边的俩个自增啊,所以那个地方不管是不是0或1,中间俩个自增都会执行啊

可是我改成0为什么不执行,如果不执行,那么他们的优先级就一样了啊

第2个回答  2015-10-11
|| 或是&& 是逻辑运算
n=1||(后面无论是什么) 等同于 n=true||(无论是什么)
此时 n=true 也就是1
显示结果是没有错的追问

我查了资料&&的优先级比||优先级高,应该先执行&&俩边才对啊

我知道啊,可是&&的优先级高于||,按理说先执行&&啊

追答

有规定运算方向的按照运算方向优先

追问

那请问下,什么情况下&&运算符才比||运算符先执行

追答int a ,b ,c;
a=0;
b=100;

if(a||b>0&&b<1){
printf("1");
}
else
{
printf("0");
}

结果为 0

在这个情况下,先计算b>0&&b<1 =0,在计算 a||0=0

|| 左值=1时,=1;左值=0时,计算右值,再合并

&&左值=0时,=0;左值=1时,计算右值,再合并

追问

那把a的值改为1似乎后面的也还是不执行啊

追答

是的,这叫短路运算,

本回答被提问者和网友采纳
第3个回答  2015-10-11
n后面的式子结果是非0,所以n=1
下面的printf里的i,j,k与上面n=……式子的运算顺序没有关系,因为你输入的是i,j,k这个顺序所以他就按ijk的顺序输出,你试试吧ijk改成jik,再看看结果
n=……这个式子只能判断n是否为真(0或1),并不能决定下面输出的顺序,输出顺序呢是由printf()函数里你输入的顺序(i,j,k)决定,||和&&只能决定运算顺序追问

我将n =后面的1改成了0它就改变了i,j,k,的值

追答

  变成了1462对吧

  这是逻辑运算中的短路现象,

  当&&前面是0时,&&后面的不计算。因为无论后面是1还是0他的结果都是0

  当||前面不是0是,||后面的不计算。因为无论后面是1还是0他的结果都是1

    虽然&&比||的优先级高,但是C保证逻辑表达式是从左至右求值的!!!!!

  so当n=1时由于短路现象,直接跳过||后的式子,所以就不存在ijk的自增

  当n=0时,需要看后面的式子是否为1,所以需要运算||后面的式子,ijk自增,输出结果就为1462。

追问

不是,不进行计算,直接原值输出

追答

我吧n||后面改成0的运行结果是1462……

追问

我说错了。。1是不计算,0计算了,抱歉,😄

第4个回答  2016-12-24
&& 的高
优先级【高到低】:
第一级:
圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】
第二级:
逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】
第三级:乘法运算符【*】、除法运算符【/】、取余运算符【%】
第四级:加法运算符【+】、减法运算符【-】
第五级:左移动运算符【<>】
第六级:关系运算符【 > = 】
第七级:等于运算符【==】、不等于运算符【!=】
第八级:按位与运算符【&】
第九级:按位异或运算符【^】
第十级:按位或运算符【|】
第十一级:逻辑与运算符【&&】
第十二级:逻辑或运算符【||】
第十三级:条件运算符【?:】
第十四级:赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】
第十五级:逗号运算符【,】

c语言逻辑运算符 我不明白&&和||到底是怎么运算的
优先级:&&的优先级比||高,所以在写在一起时,先计算&& 再计算||。相同符号时,自左向右计算。4 短路原则:对于&&,如果左操作数a为0,那么结果必然为0,右操作数b将不参与计算。对于||,如果左操作数a非0,那么结果必然为1,右操作数b将不参与计算。

计算机C语言中逻辑运算符“与”“或”“非”优先级是怎样的?
非的优先级最高(它是一个单目操作符)与的优先级次之或的优先级,最低单目操作符的优先级最高。1)&&:当且仅当两个运算量的值都为"真"时,运算结果为"真",否则为"假"。2) || :当且仅当两个运算量的值都为"假"时,运算结果为"假",否则为"真"。3) ! :当运算量的值为"真"...

在C语言中,,&& 和||的优先级哪个高?
在C语言中,理解逻辑运算符的优先级对于编写正确的程序至关重要。人们经常困惑于"&&" 和 "||" 这两个逻辑运算符的优先级问题。但事实是,这两个运算符属于同一级别,也就是说,它们的优先级相等。因此,在表达式中,它们的执行顺序取决于它们在表达式中的位置,即“谁在前算谁”。理解这两个运算符...

c语言中&&和>的优先级哪个更高?
第六级:关系运算符【 > = 】第七级:等于运算符【==】、不等于运算符【!=】第八级:按位与运算符【&】第九级:按位异或运算符【^】第十级:按位或运算符【|】第十一级:逻辑与运算符【&&】第十二级:逻辑或运算符【||】第十三级:条件运算符【?:】第十四级:赋值运算符【= += -= ...

C语言中ll 和&&优先级问题:如何验证&&优先级比||高而避开惰性原则?
虽然&&是优先于||,但他们是同级的,即使先判断后面的,最后还是会需要判断--x,所以,--x在前,直接判断--x,如果为1,就直接不需要判断后面的了,会节省很多时间。--y&&++z||--x。。就会先判断前面--y&&++z。。说明逻辑判断&&、||是同一级别的,都是从左到右开始判断。。用反汇编来检查...

C语言中&&(与)和|(或)的优先级到底哪个高,还是一样高啊?
不一样啊!”=“在c语言中是一个赋值符号,它的优先级在c语言中是最低的!!!而“==”是关系运算符,它的优先级是高于“=”的!

C语言中 &&和‖谁优先级更高
优先级【高到低】:第一级:圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】第二级:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&...

C语言中运算符=和&=的优先级为什么相同?后者是什么意思?
很多人都把&和&&搞混,&&是逻辑运算符,叫做与,它计算的结果只有0和1两个;&叫做按位与,优先级比&&高,它的计算方法是把两个数都转化成二进制,然后对应的每一位分别进行与运算,得到的数是结果。例如说 int a=2; int b=3; a&=b;2的二进制是10 3的二进制是11 按位与结果是10,...

为何C语言中||优先于&&运算符?
整个表达式的值才为假(0)。它们在C语言中是严格执行运算符优先级规则的,即&&比||优先级高。此外这两个运算符的优先级高于赋值运算符,但低于算术运算符。与加减乘除运算符相比,逻辑运算符的优先级较低。在表达式中,如果有多种运算符,需要按照优先级和结合性进行计算,以保证表达式的正确性。

C语言逻辑运算符&&和||同时存在时候,不应该先算&&吗?
++的优先级最高,所以先算++x,结果x=1,后面的运算符是||,这就意味着不管||后面的运算结果是什么,最后结果都是1,所以尽管&&的优先级高,但也不用计算了,所以最终结果x=1,y=0,z=0 注意一点:优先级与求值顺序无关!

相似回答