【问题标题】:Tricks for catching & and && misuse in C?在 C 中捕获 & 和 && 误用的技巧?
【发布时间】:2015-03-11 21:16:57
【问题描述】:

上个月我遇到了一系列错误,原因是在 C 中输入错误的“&”而不是“&&”。

我最新的一个很简单 - 即我写了

value = data && 0x0123

很明显,在我中断后看到值是 0 或 1,但我想要一种方法来更早地捕捉到这个,类似于编码

if (1 == END) ... 

发现滥用===

有什么想法吗?

【问题讨论】:

  • 只写好代码?!很简单
  • 由于您标记了 C++:在 C++ 中,您可以使用 andbitand 而不是 &&&See here
  • 不能说我曾经遇到过这个问题。
  • @LightnessRacesinOrbit 是对的。除非您不知道&&& 之间的区别并且现在您发现并且不想在您的代码中搜索此类问题,否则犯此错误是没有意义的,我建议您使用 grep搜索所有可能出现的 &&& 并修复每一个。

标签: c++ c binary mask


【解决方案1】:

在 C++ 中,andbitand 分别是 &&& 的替代品(您可以在 cppreference 上找到所有替代品)。

#include <iostream>

int main()
{
    std::cout << std::boolalpha << (42 and 0x0123) << std::endl;
    std::cout << std::boolalpha << (42 bitand 0x0123) << std::endl;
    return 0;
}

Live on Coliru (感谢 Fred Larson 的 std::boolalpha 建议)

C99 将这些定义为 iso646.h 中的宏(感谢 Shafik Yaghmour,more details in one of his answers

【讨论】:

  • 由于问题也被标记为C,因此您还应该说明需要iso646.h。请注意,我不是反对者。
  • 我认为adding std::boolalpha 让您的示例代码更加明显。
  • @FredLarson 感谢您的建议,我已经用它更新了我的答案。
  • 值得注意的是orbitor也可以分别替换|||
  • &lt;iso646.h&gt; 实际上是在 1995 年通过修正案 (ANSI/ISO/IEC 9899-1990-AM 1-1995) 添加到 C 中的,因此 C99 之前的编译器可能会支持它。跨度>
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2016-06-16
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多