【问题标题】:Places where assignment operator can be used wrongly instead of comparison operator , = Vs == [closed]可以错误使用赋值运算符而不是比较运算符的地方,= Vs == [关闭]
【发布时间】:2017-11-23 10:21:35
【问题描述】:

我正在做一个 C++ 编译器项目,我需要在可能错误使用赋值运算符而不是比较运算符的地方标记警告。 。例如 在if 语句中进行比较时,检查变量a 为10 有时我们错误地输入if(a= 10),这将导致if 语句总是true 而我想只有当a 是10 时才为真。我能想到的一些案例是:

  1. if(var = a),逻辑上应该是if( var==a )
  2. while(var = a )
  3. for(;var=a;)
  4. do{}while(var=a)
  5. var=a? "some XYZ": "some ABC"

能否请您帮助我解决可能发生此逻辑错误的更多情况,用户应该使用==,而错误地使用了=?

【问题讨论】:

  • 反过来呢,使用比较而不是赋值呢?我已经看过几次了。
  • 至于您的“问题”,一些编译器可以检测到这一点并发出警告。并且有许多很好的静态分析工具也可以检测到此类问题(以及更多)。
  • 如果我是你,我不会在这上面浪费时间。有时您想要将赋值作为循环条件,例如在字符串复制习语中。有时你想在通常写作业时进行比较。恕我直言,人们只需要在他们身上灌输差异。
  • 编写静态分析工具是一个不错的项目,但如果您想做一些很棒的事情,请选择表明这是故意的。仅仅因为这种用法对你 来说似乎是一个错误,并不意味着它是一个错误句号。我的意思是,想想芭丝谢芭告诉你的吧。
  • 否,请选择一项。有细微的差别。例如,a == b 的结果类型在 C 中是 int,在 C++ 中是 bool。

标签: c++ compiler-errors compilation compiler-warnings


【解决方案1】:

我最近遇到的一个讨厌的问题是assert (a=b)。之所以特别讨厌,是因为断言中陈述的假设是两者已经相等,因此该陈述很可能是无害的。但如果不是,这会让您陷入令人讨厌的调试会话,因为调试版本在功能上与发布版本不同。

【讨论】:

  • 这个纯粹是邪恶的
  • 嗯,在assert 中使用赋值是总是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多