我可以在int值上使用C ++中的not运算符吗?

时间:2010-11-08 11:54:29

标签: c++ int logical-operators negation

奇怪的问题,但有人告诉我这个, 我想知道你能不能使用! C ++中的int运算符? (对我来说很奇怪)。

#include <iostream>
using namespace std;

int main()
{
   int a=5, b=4, c=4, d;
   d = !( a > b && b <= c) || a > c && !b;
   cout << d;
   system ("pause");
   return 0;
}

5 个答案:

答案 0 :(得分:23)

是。对于整数类型,!如果操作数为零则返回true,否则返回false

所以!b这意味着b == 0


这是将值转换为bool的特殊情况。 !b可以被视为!((bool)b),因此问题是b的“真实性”是什么。在C ++中,算术类型,指针类型和枚举可以转换为bool。当值为0或null时,结果为false,否则为true(C ++§4.1.2)。

当然,自定义类甚至可以超载operator!operator&lt; 类型可以转换为bool &gt;允许!b为他们的课程。例如,std::stream已经超载了operator!operator void*以检查故障位,因此像

这样的习语
while (std::cin >> x) {   // <-- conversion to bool needed here
  ...

可以使用。

(但您的代码!( a > b && b <= c) || a > c && !b只是神秘莫测。)

答案 1 :(得分:7)

最初,在C(C ++所基于的)中没有布尔类型。而是将值“true”分配给任何非零值,将值“false”分配给任何计算为零的值。这种行为在C ++中仍然存在。因此对于int x,表达式!x表示“x不为真”,即“x不为非零”,即如果x则为真是零。

答案 2 :(得分:4)

您可以!b相当于(b == 0)

答案 3 :(得分:3)

int的测试对于非零值为true,对于零值为false,因此对于零值不是正确,对于非零值则不是false。

答案 4 :(得分:3)

内置!运算符将其参数转换为bool。该标准指定 存在来自任何算术类型的转换(intchar,.... floatdouble ...) bool 。如果源值为0,则结果为true,否则为false