在编程的过程中,经常会使用==与=两个符号,两符号不同于与数学运算符"=="与"=",在C++中,运算符“==”表示等一操作符,判断两边是否相等。利用相等运算符,如果希望相等运算符返回true,则运算符两侧的值或语句必须使相等的;如果不相等,则==运算符返回false。
int c = 0;
printf("%d \n", c==2);
运行输出
0
int c = 0;
printf("%d \n", c==0);
运行输出
1
运算符“=”表示是赋值的意思,它的作用是将一个表达式(或者是一个左值,或者是一个右值)的值赋给一个左值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量,赋值符号的返回值是其本身。
int c = 0;
printf("%d \n", c=2);
运行输出
2
在很多时候,程序员在编写代码时会出现大量的逻辑判断,很容易手误把判断符号“==”写成“=”赋值符号,更致命的是,编译器并不会报错,且赋值返回的是本身,造成程序的逻辑bug。这种bug是最容易被忽视,最难排查的。在编程中规范的使用“==”符号,能够有效提升程序的开发效率。例如:
1.指针操作时常使用的非空检查:
int *p = new int(1);
if(p=nullptr){
cout<<"指针为空"<<endl;
}
else{
cout<<"指针非空"<<endl;
//do something
}
运行结果
指针为空
例1中明显手误把“=”当作“==”,且编译器并不会报错,导致程序的执行过程事与愿违,且造成了内存泄漏。
规范操作:
int *p = new int(1);
if(nullptr==p){
cout<<"指针为空"<<endl;
}
else{
cout<<"指针非空"<<endl;
//do something
}
运行结果
指针非空
如果手误把“=”当作“==”:
int *p = new int(1);
if(nullptr=p){
cout<<"指针为空"<<endl;
}
else{
cout<<"指针非空"<<endl;
//do something
}
运行结果
C2440 “=”: 无法从“int *”转换为“nullptr”
E0137 表达式必须是可修改的左值
编译器报错:表达式左边“nullptr”不是可修改的左值,此做法利用编译器对"="语法检查,排除逻辑bug,回避了此类bug的产生.
2.数字判断
int flag = 1;
if (flag = 2 )
cout << "flag值为2" << endl;
else
cout << "flag值不为2" << endl;
运行结果
flag值为2
例2中手误把“=”当作“==”,且编译器并不会报错,导致程序的执行过程事与愿违,且手动修改了变量的状态值。
规范操作:
int flag = 1;
if ( 2 == flag )
cout << "flag值为2" << endl;
else
cout << "flag值不为2" << endl;
运行结果
flag值不为2
如果手误把“=”当作“==”:
C2106 “=”: 左操作数必须为左值
E0137 表达式必须是可修改的左值
编译器报错:“=”左操作数必须为左值,此做法利用编译器对"="语法检查,排除逻辑bug,回避了此类bug的产生.