在比较语句中替换操作数的顺序来避免人为错误

ZDNet软件频道 时间:2003-08-06 作者:ZDNet China |  我要评论()
本文关键词:cpptips
用赋值操作符=替代等于操作符==是一个普遍的错误,这个不仅是对初学者而言。问题发生在C++的if赋值语句中。
本文译自Builder.com,未经许可请勿转载用赋值操作符=替代等于操作符==是一个普遍的错误,这个不仅是对初学者而言。问题发生在C++的if赋值语句中。例如:

int user=12;
bool permitted;
boolis_allowed(intuserid);

if(permitted=is_allowed(user)) // intended =
{
  run_script();
}

    首先将函数调用的值赋给if语句,然后再计算值。你可以按照下面的方式改写这个if语句:

permitted=is_allowed(user); //assign first
If(permitted) // evaluate
{
  run_script();
}

    尽管这种方法敲打键盘的次数较多一点,但是它更具有可读性而且减少了产生认为错误的风险。

    在一些例子中,赋值操作符的使用是无意的。下面的例子实际上是为了检查val是否等于OK而不是给它赋值。

 if(val=OK) // actually meant "val==OK"
{
  //..do something
}

    尽管在这个例子中编译器会提出警告,但是会忽略了它。最后,这个有效代码使编译器不知道这个程序的意图。

    为了避免印刷错误,很多程序员在等式语句中倒转操作数的顺序。比如:

    if(OK==val) // can't mistake == for =
{
  //..do something
}

      从语义上来说,val==OK和OK==val是等价的。但是,当你把rvalue放在左边的时候就不能用=代替==因为编译器认为这是一个错误。

   // mistook == for =
// error caught at compile time

if(OK=val)

    使复合型语句形成单独语句的条件语句中建议避免使用赋值语句。当用==语句时你可以倒转操作数的顺序这样rvalue出现在左边,这样可以使编译器发现人为错误。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134