“是什么意思?”;int i,(!!i)“;? 我们有以下C++代码: int 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的操作是什么?

一元
运算符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”操作。