NOT运算符有什么意义?

时间:2013-03-25 16:41:37

标签: c++

目前使用this tutorial检出C ++。它解释了! NOT运算符的含义,但我不认为我完全理解为什么我想要使用它。有人可以解释一下吗?

12 个答案:

答案 0 :(得分:13)

如果要检查当前是否满足条件,!运算符非常有用。

想象一个函数,告诉您应用程序的特定子系统是否已初始化,以及另一个初始化它的函数:

bool subsystem_is_initialized();
void subsystem_initialize();

如果没有使用not运算符,您可以检查它是否已初始化并初始化。

if (!subsystem_is_initialized())
    subsystem_initialize();

出于所有实际目的,将值与零进行比较是一种较短的方法,并明确暗示受影响的值为布尔值。你并不是绝对需要它,但是再一次,你也不需要乘法(你可以循环添加),添加(你可以用二进制逻辑),或者大多数二进制逻辑(你可以做任何事情) NAND,我被告知,但我自己没有研究过。)

还要记住,像几乎所有其他C ++运算符一样,它可以被类重载。

答案 1 :(得分:5)

一种语言并不总是(事实上从未像现在这样好)被定义为具有最小的特征集,但有一组有用的特征。例如,如果您有以下代码:

if (!test_something())
  do_something();

您也可以将其表达为

if (test_something()) {
} else
  do_something();

但它不太容易阅读。因此,虽然逻辑否定通常可以通过C ++语言的其他结构来表达,但它有助于可读性明确表示否定以表明您的意图。

答案 2 :(得分:5)

当您需要在条件中翻转true / false时使用它,以提高可读性。 例如 比较

// Ensure that the thing is NOT red.
if (thing_is_red() == false)
    ...
if (!thing_is_red())
    ...

答案 3 :(得分:2)

在布尔条件检查中,

!运算符用于否定目的。有很多地方可以使用它。简单的例子:

 if (!existInArray(A, i))

检查数组中是否不存在i

答案 4 :(得分:2)

!或NOT运算符是NOT门的逻辑等价物。

因此,NOT门真值表表示如果x为真,则!x为假。反之亦然。

如果从逻辑上考虑它并不太难。例如,男性不是女性,不是真假,不简单是复杂的。

答案 5 :(得分:2)

tutorial you mention

  

NOT:NOT运算符接受一个输入。如果该输入为TRUE,则返回FALSE,如果该输入为FALSE,则返回TRUE。

它表示NOT运算符是一元运算符意味着单个操作数(不是二元运算符)

&& and ||`是二元运算符,语法是:

  result = operand1  && operand2
  result = operand1  || operand2

一元是:

  result = !operand1 

并且其结果值将恢复操作数值id operand1 = True,然后结果将为False,如果operand1 = False结果为True。

同样写在那里:

  

例如,NOT(1)求值为0,NOT(0)求值为1. NOT(任何数字,但为零)求值为0.在C和C ++中,NOT写为!。 NOT在AND和OR之前进行评估。

c / c ++中的

0是假的 非0相当于True。

还有几个很好的例子!

(1)。

!( 1 || 0 )  

我们知道1 || 01表示正确,NOT运算符的应用使0表示错误:

    !( 1 || 0 )  
=>  ! (1)     
=>  0  that is false

您是否注意到在此表达式中我们有两个运算符逻辑||! NOT运算符。

    !( 1  || 0 )  
    ^      ^
    NOT   OR  

并注意到OR运算符||有两个操作数位为一元NOT

答案 6 :(得分:2)

最常见的情况可能是std::istream

int i;
std::cin >> i;
if ( ! std::cin ) {
    //  Something went wrong...
}

除此之外,各种类都有isValid()isDone()个职能;使用GoF迭代器进行迭代 例如:

for ( IteratorType i( init ); ! i.isDone(); i.next() ) {
    //  Do something with i.element()
}

地图类通常具有contains功能,因此您可能会问

if ( ! myMap.contains( key ) )

您还将不时使用布尔变量:for 线性搜索匹配条件需要一些 复杂的评估,例如:

bool found = false;
int current = 0;
while ( ! found && current != end ) {
    //  maybe set found...
}

答案 7 :(得分:1)

好的,你想把两个数字的总和除以第三个,所以如果第三个数字不为零,你可以这样做。

    #include <iostream>
    using namespace std;
    int main()
   {
    int a,b,c,sum;
    cin >> a >> b >> c;
    sum = a+b;
    if (c!=0) //which is equivalent to if(!c)
    cout << sum/c;
   }

我使用了一个简单的例子来快速理解它。一切都好吗?关心你的学习并祝你好运。

答案 8 :(得分:1)

!运算符的要点是将false表达式转换为true表达式。它通常用作== false== 0的替代品。它通常使表达更容易阅读:

if(p == NULL || p-&gt; next!= NULL)

与:

相同

if(!p || p-&gt; next)

[好吧,所以“这里更容易阅读”显然非常主观]。

答案 9 :(得分:1)

你有很多解释NOT运算符的答案。

我自己并不是!运营商的忠实粉丝。它几乎没有应有的可见(因为它颠倒了条款的含义)。

例如,尽管在C ++中进行了几年的编程,但仍需要几秒钟的时间来解析if ( ! ptr )而不是if ( ptr == NULL ),它会立即传达我的意思。

if ( ! (i % 2) )检查偶数或奇数吗?如果你的眼睛超过'?'后没有得到答案,并且/或者必须再次审查if条件,那么你刚刚提出了我的理由。

回顾帖子,我同意NOT运算符在应用于bool和函数调用时具有有效用途的一些海报。处理流时使用!被认为是惯用的。

那就是说,我认识的几乎每个程序员都被strcmp咬了。我在一家有#define#define STRCMP_EQUAL 0之类的商店工作过,并要求将支票写成if ( STRCMP_EQUAL == strcmp(str1, str2) ),在我看来,这些支票的数量级更为明确比if ( ! strcmp(str1, str2) )

答案 10 :(得分:1)

! operator可以与用户定义的数据类型(c ++中的类和结构)一起使用。 像每个运算符(期望。:和::)!运算符可能会重载。请参阅以下方案。

//A is empty if memeber size is 0, and no further operations are allowed on other members if
// class is empty.
class A{
int size;
int lot;
int price;
public:
   bool operator!()
  {
      if(lot)
       return true; 
      else
      return false;
  }
};

A AObj;

//Aobj has size greater than 0
if(!Aobj)
{
//code to Fill or reuse the object.
}

答案 11 :(得分:1)

重点! operator是将一个false表达式转换为true表达式。它通常用作== false或== 0的替代。它通常使表达式更容易阅读:

if(p == NULL || p-&gt; next!= NULL)

与:

相同

if(!p || p-&gt; next)

[好吧,所以“这里更容易阅读”显然非常主观]。