0
点赞
收藏
分享

微信扫一扫

C++ 高效编程:规范使用 == 判断符

王远洋 2022-03-13 阅读 88

在编程的过程中,经常会使用==与=两个符号,两符号不同于与数学运算符"=="与"=",在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的产生.

举报

相关推荐

0 条评论