相关疑难解决方法(0)

什么是 ":-!!" 用C代码?

我在/usr/include/linux/kernel.h中碰到了这个奇怪的宏代码:

/* Force a compilation error if condition is true, but also produce a
   result (of value 0 and type size_t), so the expression can be used
   e.g. in a structure initializer (or where-ever else comma expressions
   aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
Run Code Online (Sandbox Code Playgroud)

怎么:-!!办?

c linux macros linux-kernel

1627
推荐指数
5
解决办法
18万
查看次数

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

我一直在挖掘Linux内核的某些部分,发现这样的调用:

if (unlikely(fd < 0))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

要么

if (likely(!err))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)

我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).

linux gcc linux-kernel likely-unlikely

331
推荐指数
6
解决办法
13万
查看次数

什么是C中的>>> =运算符?

由同事作为一个谜题,我无法弄清楚这个C程序实际上是如何编译和运行的.什么是这个>>>=运算符和奇怪的1P1文字?我在Clang和GCC进行了测试.没有警告,输出是"???"

#include <stdio.h>

int main()
{
    int a[2]={ 10, 1 };

    while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
        printf("?");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c obfuscation bit-shift literals digraphs

291
推荐指数
3
解决办法
2万
查看次数

是!! 在C++中转换为bool的安全方法?

[这个问题有关,但并不等同于这一个 ]

如果我尝试使用某些类型的值作为布尔表达式,我会收到警告.我有时使用三元运算符(?:)转换为bool 而不是抑制警告.使用两个not运算符(!!)似乎做同样的事情.

这就是我的意思:

typedef long T;       // similar warning with void * or double
T t = 0;
bool b = t;           // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t;              // any different?
Run Code Online (Sandbox Code Playgroud)

那么,双重技术真的做同样的事吗?它比三元技术更安全吗?这是技术与非整数类型(例如,具有同样安全void *doubleT)?

我不是在问好!!t风格.我在问它是否在语义上不同于t ? true : false.

c++ boolean visual-c++

49
推荐指数
6
解决办法
2万
查看次数

为什么用!!(条件)代替(条件)?

我见过人们使用带有两个'!'的条件子句的代码

#define check_bit(var, pos)       (!!((var) & (1 << (pos))))
#define likely(x)       __builtin_expect(!!(x),1)
#define unlikely(x)     __builtin_expect(!!(x),0)
Run Code Online (Sandbox Code Playgroud)

是我能找到的一些例子.

使用!!(condition)结束有什么好处(condition)吗?

c logical-operators

35
推荐指数
2
解决办法
2285
查看次数

使用双逻辑非(!!)运算符混淆

我有一些广泛使用的C++代码!!.我有点困惑,因为据我所知,!!它不是一个独立的运营商,而是两个!接一个的运营商.所以那就意味着!!foo和刚刚一样foo.

!!实际上是否有任何地方和/或理由?我在考虑它是否可能有一些明智的含义?那么你首先执行一些有点操作foo,然后!对结果执行?但我似乎不记得!被用作一个有点明智的操作员,似乎没有找到任何参考告诉我它也是.据我所知!,仅用作逻辑运算符,在这种情况下

!!foo == foo

c++ bitwise-operators logical-operators

31
推荐指数
2
解决办法
8521
查看次数

!!(x)在C(特别是Linux内核)中的含义是什么?

我一直在阅读Linux内核(特别是2.6.11).我发现了以下定义:

#define unlikely(x)     __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)

(来自linux-2.6.11/include/linux/compiler.h:61 lxr链接)

什么!! 完成?为什么不使用(x)?

也可以看看:

c gcc

23
推荐指数
3
解决办法
3676
查看次数

什么是"!!"的用法 (否定两次)?

可能重复:
C++代码中的双重否定

让我们说:

bool var = !!true;
Run Code Online (Sandbox Code Playgroud)

它将为变量赋予"true".似乎没用,但我看的是Visual Studio对"断言"的定义,它是:

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
Run Code Online (Sandbox Code Playgroud)

为什么它两次否定"_Expression"?

我想知道他们想强迫"!" 要调用的运算符(在它超载的情况下),但这似乎不是一个好理由.

c c++

15
推荐指数
1
解决办法
841
查看次数

为什么要用两个'!' 运算符的布尔值?

可能重复:
C++代码中的双重否定

当我扫描Webkit源代码时,我发现了一个奇怪的使用布尔"not"运算符!:

BOOL enabled;
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled)))
    continuousSpellCheckingEnabled = !!enabled;
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
    grammarCheckingEnabled = !!enabled;
Run Code Online (Sandbox Code Playgroud)

他们为什么不enabled直接使用而不是!!enabled

c++ boolean

12
推荐指数
2
解决办法
460
查看次数

正在使用'!!' 在C/C++中的良好实践并且它很常见吗?

可能重复:
C++代码中的双重否定

据我所知,没有C/C++书籍教程或手册提到这种技术.也许是因为它只是一个小小的东西,不值得一提.

我使用它是因为C/C++将bool类型与int,long,pointer,double等混合在一起.需要将非bool转换为bool是很常见的.使用(bool)值来做这件事是不安全的,所以我习惯!!这样做.

例:

bool bValue = !!otherValue;
Run Code Online (Sandbox Code Playgroud)

c c++

8
推荐指数
3
解决办法
580
查看次数