6

目前正在使用本教程检查 C++ 。它解释了! NOT运算符是什么,但我认为我并不完全理解我为什么要使用它。有人可以解释一下吗?

4

12 回答 12

13

!如果要检查当前是否不满足条件,则该运算符很有用。

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

bool subsystem_is_initialized();
void subsystem_initialize();

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

if (!subsystem_is_initialized())
    subsystem_initialize();

出于所有实际目的,将值与零进行比较是一种更短的方法,并明确建议受影响的值是布尔值。你不是绝对需要它,但话又说回来,你也不需要乘法(你可以循环加法)、加法(你可以用二进制逻辑来做)或大多数二进制逻辑(你几乎可以用NAND,有人告诉我,但我自己没有研究过)。

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

于 2013-03-25T16:44:39.280 回答
5

当您需要在条件中翻转真/假时使用它以增加可读性。例如比较

// Ensure that the thing is NOT red.
if (thing_is_red() == false)
    ...
if (!thing_is_red())
    ...
于 2013-03-25T16:47:52.900 回答
5

一种语言并不总是(实际上和从来没有一样好)被定义为具有最少的功能集,而是一组有用的功能。例如,如果您有以下代码:

if (!test_something())
  do_something();

您也可以将其表示为

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

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

于 2013-03-25T16:46:38.987 回答
2

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

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

如果你从逻辑上考虑它并不太难。例如男性的NOT是女性,NOT true是false,NOT simple是复杂的..

于 2013-03-25T16:47:41.160 回答
2

好的,您想将两个数字的总和除以第三个数字,因此如果第三个数字不为零,您可以这样做。

    #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;
   }

为了快速理解,我使用了一个简单的例子。现在一切都好吗?问候并祝你学习顺利。

于 2013-03-25T16:51:16.420 回答
2

您提到的教程

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中为 False,Non0等价于 True。

也有几个很好的例子!

(1)。

!( 1 || 0 )  

我们知道1 || 0is1表示 true 并且 NOT 运算符的应用使其0表示 False:

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

你注意到在这个表达式中我们有两个运算符逻辑||或和!非运算符。

    !( 1  || 0 )  
    ^      ^
    NOT   OR  

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

于 2013-03-25T16:50:06.090 回答
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 ) )

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

bool found = false;
int current = 0;
while ( ! found && current != end ) {
    //  maybe set found...
}
于 2013-03-25T16:50:06.617 回答
2

!运算符用于布尔条件检查中的否定目的。有很多地方可以使用它。简单的例子:

 if (!existInArray(A, i))

检查i数组中是否不存在。

于 2013-03-25T16:45:51.597 回答
1

运算符的重点!是使表达式false成为true表达式。它最常用作== falseor的替代品== 0。它通常使表达式更易于阅读:

if (p == NULL || p->next != NULL)

是相同的 :

如果 (!p || p->next)

[好吧,所以这里的“更容易阅读”显然是相当主观的]。

于 2013-03-25T16:51:32.757 回答
1

!运算符可以与用户定义的数据类型(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.
}
于 2013-03-25T17:48:33.140 回答
1

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

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

例如,尽管用 C++ 编程了几年,但我仍然需要几秒钟来解析if ( ! ptr ),而不是if ( ptr == NULL )立即传达给我它的含义。

是否if ( ! (i % 2) )检查偶数或奇数?如果您的眼睛越过'?

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

也就是说,几乎我认识的每个程序员都被strcmp. 我在一家有几个#defines 之类的商店工作#define STRCMP_EQUAL 0,并要求将支票写成if ( STRCMP_EQUAL == strcmp(str1, str2) ),在我看来,它比if ( ! strcmp(str1, str2) ).

于 2013-03-25T17:24:48.380 回答
1

的重点!运算符是将一个错误的表达式变成一个真正的表达式。它最常被用作 == false 或 == 0 的替代品。它通常使表达式更易于阅读:

if (p == NULL || p->next != NULL)

是相同的 :

如果 (!p || p->next)

[好吧,所以这里的“更容易阅读”显然是相当主观的]。

于 2013-03-25T17:49:22.777 回答