目前使用this tutorial检出C ++。它解释了! NOT
运算符的含义,但我不认为我完全理解为什么我想要使用它。有人可以解释一下吗?
答案 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)
NOT:NOT运算符接受一个输入。如果该输入为TRUE,则返回FALSE,如果该输入为FALSE,则返回TRUE。
它表示NOT运算符是一元运算符意味着单个操作数(不是二元运算符)
像&& and
||`是二元运算符,语法是:
result = operand1 && operand2
result = operand1 || operand2
一元是:
result = !operand1
并且其结果值将恢复操作数值id operand1 = True
,然后结果将为False,如果operand1 = False
结果为True。
同样写在那里:
c / c ++中的例如,NOT(1)求值为0,NOT(0)求值为1. NOT(任何数字,但为零)求值为0.在C和C ++中,NOT写为!。 NOT在AND和OR之前进行评估。
0
是假的
非0
相当于True。
还有几个很好的例子!
(1)。
!( 1 || 0 )
我们知道1 || 0
是1
表示正确,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)
[好吧,所以“这里更容易阅读”显然非常主观]。