运算符优先级与关系运算符

今天写一些关于运算符优先级与关系运算符的一点细节。

不多说,直接上代码

1.关于运算符优先级与关系运算符细节

/*

**test3.cpp : Defines the entry point for the console application.

**系统winXP SP3 32位.

**关于运算符优先级

*/

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"


int main(int argc, char* argv[])

{

        int i = 10 , j = 3, k = 0;

        int l;

        int gression = 1024;  //二进制为10000000000

        gression = gression >> 8;//右移8bit,00000000100

        printf("result = 0x%x\n",gression); //十六进制表示

/******************************************************************

****测试语句

        //printf("%d\n", (i==1&&(j==1 || k = k+1)));//left operand must be l-value

        //printf("%d\n",k = k+1);//right

        //printf("%d\n",j==1||k);//正确,结果为0

        //printf("%d\n",j == 1||k=k+1);//left operand must be l-value

        //printf("%d\n",k=k+1||j == 1);//正确,结果为1

        //printf("%d\n",k = 1||j == 1);//正确,结果为1

        //printf("%d\n",1 ||l=k+1);//错误,left operand must be l-value

        //printf("%d\n",1 ||l=0+1);//错误,left operand must be l-value

        //printf("%d\n",1 ||0+1);//错误,left operand must be l-value

        //printf("%d\n",1 ||k=k+1);//错误,left operand must be l-value

        //printf("%d\n",j==1||k < 1);//正确

**********************************************************************/

        printf("%d\n",j==1||!(0+1));//正确


        return 0;

}

Tips:left operand must be l-value指不能作为左值,1.我们想要看看i==1&&(j==1 || k = k+1)的计算顺序,所以写出printf("%d\n", (i==1&&(j==1 || k = k+1)))这句话,但是经过编译出错left operand must be l-value左值不正确,分解试一下到底哪里出错1.1printf("%d\n",k = k+1)正确,

1.2printf("%d\n",j==1||k)正确,

1.3printf("%d\n",k=k+1||j == 1)正确,

1.4printf("%d\n",k = 1||j == 1)正确,

1.5printf("%d\n",1 ||k=k+1)错误,左值不正确,我们发现有点苗头,似乎是或运算的右边不能为变量,

1.6我们试一下printf("%d\n",j == 1||k=k+1)错误,或许为自身赋值出现错误了?

1.7再试printf("%d\n",1 ||l=k+1)错误,或许等式右边不能有变量?

1.8再试printf("%d\n",1 ||l=0+1)错误,等式本身就不能有变量,不能写赋值语句?

1.9再试printf("%d\n",1 ||0+1)错误,或语句右边必须为一个无需运算的常量?

1.10再试printf("%d\n",j==1||k < 1)正确,???仅仅是不可以用赋值与运算语句???

首先我们知道|运算是把逻辑表达式全部计算完,而||运算具有短路计算功能,且从左至右进行逻辑表达式的计算

也知道k<1得出的是bool值,而运算出来的是整型或其他类型,难道是转换的问题,所以我们再试

1.11printf("%d\n",j==1||!(0+1))正确,到这里我们明白原来是数值类型转换出现的问题

再验证我们的猜想1.12printf("%d\n",j==1||!(k= k+1))正确,猜想正确。

得出结论:或语句的右边需要为bool类型,无需类型转换,&&关系也请大家自己试一下,其实都一样啦。

那为什么关系运算的左边可以执行类型转换,而右边不可以呢?

说下个人的想法:因为语句是自左向右执行的,而执行左边语句的时候系统还没有找到关系运算符,所以会直接运算出结果,而检测到关系运算符后左侧的值自动转换为了bool类型,而右侧不能,故报错,其实关系运算符的两边都是要求是bool类型的。那我们想测试的运算符的优先级i==1&&(j==1 || k = k+1)应该怎样改呢?大家自己思考一下哦。具体运算的顺序也参考下图吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容