“是什么意思?”;int i,(!!i)“;? 我们有以下C++代码: int i; (!!i);
变量i的操作是什么?一元“是什么意思?”;int i,(!!i)“;? 我们有以下C++代码: int i; (!!i);,c++,C++,变量i的操作是什么?一元运算符。 相当于:(!(!(i)) 根据变量的原始值,对整数应用两次求反运算符将导致0或1 如果i为0,则!我是1,因此!!我是!1,即0 如果i为非零,则!i是0,因此!!我是!0,即1 c++中未初始化的变量具有未定义的行为。它们在堆栈上分配内存,但不清理它。知道,inti将具有意外值。在操作它之前,您最终必须初始化它。我想不出处理未初始化变量有什么实际用途。对我来说,这似乎是一个糟糕的编程实践 (!!i)不会做任何事情i是否被初始化。我看到这样做是为了防止关于警告
运算符对i
变量应用了两次code>。
相当于:(!(!(i))
根据变量的原始值,对整数应用两次求反运算符将导致0
或1
- 如果
i
为0
,则!我是1
,因此!!我
是!1
,即0
- 如果
i
为非零,则!i
是0
,因此!!我
是!0
,即1
c++
中未初始化的变量具有未定义的行为。它们在堆栈上分配内存,但不清理它。知道,inti代码>将具有意外值。在操作它之前,您最终必须初始化它。我想不出处理未初始化变量有什么实际用途。对我来说,这似乎是一个糟糕的编程实践
(!!i)
不会做任何事情<代码>i
是否被初始化。我看到这样做是为了防止关于警告,变量i未使用“的警告
在奇数之后!!i
语句,变量现在(技术上)用于表达式中,因此警告被抑制,但实际上没有改变任何内容
例如:
void MyFunc()
{
int i;
(!!i); // Suppress the warning caused by the block below.
#if DEBUG // In Retail / Non-Debug code, i is not used, and a warning is created!!
i = GetCountOfSomething();
printf("The count of something is %d\n", i);
#endif // DEBUG
}
这是“不是我”。基本上把它变成1或0。@Marc B我知道它是“不是我”,但为什么是1或0?我还没有初始化。
!!(非零)->!!(对)->!false->true
<代码>!!(零)->!(真)->假。由于false和true,通常定义为1和0…如果它未初始化,则这是未定义的行为。@ChongZheng这无论如何不会导致任何事情,表达式(!!i)
会被计算,但不会使用。我猜OP想知道对未初始化变量执行该操作的动机,而不是它正在执行的操作。@black Yes,当我第一次看到代码时,我不明白他们为什么要在一个未初始化的变量上这样做,但是Stackoverflow网站不允许我提交问题,直到我将其更改为这个…无论如何。不得不说,如果一个人选择这样做,这是一个非常糟糕的编程实践。是的。一些开发环境具有警告级别,警告和中止任何使用的变量的构建,因此可能希望在开发过程中这样做以表示“不要在这方面打扰我”。对于我见过的那些,你也可以只做I=0;(这可能不会让任何人感到困惑)也许有些人只是喜欢戏剧!!,但这个问题表明,当其他人阅读您的代码时,它可能会令人困惑@AlexandreSeverino为什么会!!如果它被如上所述评论,那么它“真的很糟糕吗?”@Dronz:将其初始化为零不会解决我所描述的问题。然后初始化变量,但它仍然没有在表达式中使用。警告与未使用的变量有关。(一个关于未初始化变量的单独警告可能存在。但这是另一个问题)这对我来说似乎更糟。您将得到“使用未初始化变量”警告和/或“语句无效”警告,而不是“未使用变量”警告,并且您将调用未定义的行为。的意义是什么不管怎样,为什么不干脆i代码>?@abelenky好的,我想我看到了一些这样的警告,可以让你使用int I;i=0。在上述情况下,将i放在调试块中会起作用。似乎这只是(在我目前的例子中)在我只是快速更改以测试某些东西,不想重新排列代码,然后又不得不将其更改回时才会出现。是的,当我第一次看到代码时,我不明白他们为什么要对未初始化的变量应用“not not”操作。