wiggle标志在c/c ++中意味着什么?

cak*_*ter 0 c c++

if (~mask == 0){...}
Run Code Online (Sandbox Code Playgroud)

我在其中一个.cpp文件中遇到过这个东西,我想知道在c/c ++中是什么意思?

Lig*_*ica 8

它是一个代字号,在C++中它意味着按位NOT.

对于mask以下列位表示命名的8位无符号整数:

0010 1100
Run Code Online (Sandbox Code Playgroud)

价值~mask是:

1101 0011
Run Code Online (Sandbox Code Playgroud)

注意所有位都是如何翻转的.

为了你的if条件(~mask == 0)评估为真:

~mask: 0000 0000
 mask: 1111 1111
Run Code Online (Sandbox Code Playgroud)

在这种情况下,mask有价值255.

根据需要,将相同的逻辑应用于不同位宽和符号的整数.

(注意:实际上,如果你的系统有32位ints,~mask即使mask是8 位也是32 位.这是因为~执行整体提升.但是,我忽略了上述简单例子的这一事实.)


这是正式的定义:

[C++11: 5.3.1/10]: 操作数˜应具有整数或无范围的枚举类型; 结果是其操作数的一个补码.执行整体促销.结果的类型是提升的操作数的类型.unary-expression中 存在歧义˜X(),其中Xclass-namedecltype-specifier.解决歧义有利于将其˜视为一元补语,而不是将其˜X视为指向析构函数.

正如段落提醒我们的那样,不要在类析构函数名称中使用按位NOT来混淆前导字符.有趣的是~被选择用于析构函数; 可以说是因为人们可以将析构函数视为构造函数的相反(即逻辑NOT).