今天写一些关于运算符优先级与关系运算符的一点细节。
不多说,直接上代码
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)应该怎样改呢?大家自己思考一下哦。具体运算的顺序也参考下图吧。