目前正在使用本教程检查 C++ 。它解释了! NOT
运算符是什么,但我认为我并不完全理解我为什么要使用它。有人可以解释一下吗?
12 回答
!
如果要检查当前是否不满足条件,则该运算符很有用。
想象一个告诉你应用程序的特定子系统是否已初始化的函数以及另一个初始化它的函数:
bool subsystem_is_initialized();
void subsystem_initialize();
您可以检查它是否已初始化,如果它没有使用 not 运算符,则将其初始化。
if (!subsystem_is_initialized())
subsystem_initialize();
出于所有实际目的,将值与零进行比较是一种更短的方法,并明确建议受影响的值是布尔值。你不是绝对需要它,但话又说回来,你也不需要乘法(你可以循环加法)、加法(你可以用二进制逻辑来做)或大多数二进制逻辑(你几乎可以用NAND,有人告诉我,但我自己没有研究过)。
还要记住,与几乎所有其他 C++ 运算符一样,它可以被类重载。
当您需要在条件中翻转真/假时使用它以增加可读性。例如比较
// Ensure that the thing is NOT red.
if (thing_is_red() == false)
...
if (!thing_is_red())
...
一种语言并不总是(实际上和从来没有一样好)被定义为具有最少的功能集,而是一组有用的功能。例如,如果您有以下代码:
if (!test_something())
do_something();
您也可以将其表示为
if (test_something()) {
} else
do_something();
但它会不太容易阅读。因此,虽然逻辑否定通常可以用 C++ 语言的其他结构来表达,但它有助于提高可读性,明确表达否定以表明您的意图。
!
或者 NOT 运算符是NOT
门的逻辑等价物。
因此,NOT
门真值表表明如果x
为真,!x
则为假。反之亦然。
如果你从逻辑上考虑它并不太难。例如男性的NOT是女性,NOT true是false,NOT simple是复杂的..
好的,您想将两个数字的总和除以第三个数字,因此如果第三个数字不为零,您可以这样做。
#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;
}
为了快速理解,我使用了一个简单的例子。现在一切都好吗?问候并祝你学习顺利。
您提到的教程:
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 || 0
is1
表示 true 并且 NOT 运算符的应用使其0
表示 False:
!( 1 || 0 )
=> ! (1)
=> 0 that is false
你注意到在这个表达式中我们有两个运算符逻辑||
或和!
非运算符。
!( 1 || 0 )
^ ^
NOT OR
并注意 OR 运算符||
有一元 NOT 有两个操作数位
最常见的情况可能是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...
}
!
运算符用于布尔条件检查中的否定目的。有很多地方可以使用它。简单的例子:
if (!existInArray(A, i))
检查i
数组中是否不存在。
运算符的重点!
是使表达式false
成为true
表达式。它最常用作== false
or的替代品== 0
。它通常使表达式更易于阅读:
if (p == NULL || p->next != NULL)
是相同的 :
如果 (!p || p->next)
[好吧,所以这里的“更容易阅读”显然是相当主观的]。
!运算符可以与用户定义的数据类型(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.
}
您有很多解释 NOT 运算符的答案。
!
我自己不是运营商的忠实粉丝。它几乎没有应有的可见性(因为它颠倒了该子句的含义)。
例如,尽管用 C++ 编程了几年,但我仍然需要几秒钟来解析if ( ! ptr )
,而不是if ( ptr == NULL )
立即传达给我它的含义。
是否if ( ! (i % 2) )
检查偶数或奇数?如果您的眼睛越过'?
回顾帖子,我同意 NOT 运算符在应用于bool
s 和函数调用时有效使用的一些海报。使用!
while 处理流被认为是惯用的。
也就是说,几乎我认识的每个程序员都被strcmp
. 我在一家有几个#define
s 之类的商店工作#define STRCMP_EQUAL 0
,并要求将支票写成if ( STRCMP_EQUAL == strcmp(str1, str2) )
,在我看来,它比if ( ! strcmp(str1, str2) )
.
的重点!运算符是将一个错误的表达式变成一个真正的表达式。它最常被用作 == false 或 == 0 的替代品。它通常使表达式更易于阅读:
if (p == NULL || p->next != NULL)
是相同的 :
如果 (!p || p->next)
[好吧,所以这里的“更容易阅读”显然是相当主观的]。