当前位置: 首页 > 文档资料 > C++大学教程 >

2.20 混淆相等(==)与赋值(=)运算符

优质
小牛编辑
126浏览
2023-12-01

这是C++程序员常见的错误,包括熟练的C++程序员也会把相等(==)与赋值(=)运算符相  混淆。这种错误的破坏性在于它们通常不会导致语法错误,而是能够顺利编译,程序运行完后,因为运行时的逻辑错误而得到错误结果。

C++有两个方面会导致这些问题。一个是任何产生数值的表达式都可以用于任何控制结构的判断部分。如果数值为0,则当作false,如果数值为非0,则当作true。第二是C++赋值会产生一个值,即赋值运算符左边变量所取得的值。例如,假设把下列代码:

if(payCode==4)
cout <<"You get a bonus!" << endl;

误写成如下形式:

if(payCode=4)
cout <<  "You get a bonus!" << endl;

第一个if语句对paycode等于4的人发奖金。而第二个if语句则求值if条件中的赋值表达式为常量4。由于非0值解释为true,因此这个if语句的条件总是true,则人人都获得一份奖金,不管其paycode为多少。更糟的是,本来只要检查paycode,却已经修改了Poycode。

常见编程错误2.26

用==运算符进行赋值或用=运算符表示相等是个逻辑错误。

测试与调试提示2.1

程序员通常将条件写成x==7,即变量名在左边,常量在右边。如果反过来.即变量名在右边,常量在左边,写成7==x,刚编译器能防止程序员把==运算符写成=。编译器把这个错误当作语法错误,因为赋值语句左边只能放变量名.这样至少可以防止运行时逻辑错误的潜在破坏。

变量名可称为左值(lvalue),因为它可以放在赋值运算符左边。常量称为右值(rvalue),因为它只能放在赋值运算符右边。注意,左值可以作为右值,但右值不能用作左值。

还有一个问题也同样麻烦。假设程序员要用下列简单涪句给一个变量赋值:

x = 1;

但却写成:

x == 1;

这也不是语法错误,编译器只是求值条件表达式。如果x等于1,则条件为true,表达式返回true值。

如果x不等于1,则条件为false,表达式返回false值。不管返回什么值都没有赋值运算符,因此这个值丢失,x值保持不变,有可能造成执行时的逻辑错误。但这个问题没有简单的解决办法。

测试与调试提示2.2

用文本编辑器搜索程序中的所有=,检查是否为正确的运算符。