相关疑难解决方法(0)

C++代码中的双重否定

我刚刚进入一个拥有相当庞大代码库的项目.

我主要处理C++,他们编写的很多代码都使用布尔逻辑的双重否定.

 if (!!variable && (!!api.lookup("some-string"))) {
       do_some_stuff();
 }                                   
Run Code Online (Sandbox Code Playgroud)

我知道这些人都是聪明的程序员,很明显他们不会偶然这样做.

我不是经验丰富的C++专家,我唯一猜测他们这样做的原因是他们想要绝对肯定被评估的值是实际的布尔表示.所以他们否定它,然后再次否定它以使其恢复到它的实际布尔值.

这是正确的,还是我错过了什么?

c++ boolean

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

为什么C字符文字而不是字符?

在C++中sizeof('a') == sizeof(char) == 1.这具有直观意义,因为它'a'是一个字符文字,并且sizeof(char) == 1由标准定义.

然而,在C中sizeof('a') == sizeof(int).也就是说,看起来C字符文字实际上是整数.有谁知道为什么?我可以找到很多关于这个C怪癖的提及,但没有解释为什么它存在.

c c++ sizeof char

101
推荐指数
7
解决办法
2万
查看次数

数字文字的ULL后缀

我遇到过这样的代码:

line += addr & 0x3fULL;
Run Code Online (Sandbox Code Playgroud)

显然,'U'和'L'不是十六进制数字.我猜测该十六进制数字文字末尾的'ULL'意味着"无符号长龙" - 我是否正确?(这种事情很难谷歌)如果是这样那么这是数字上的某种后缀修饰符?

c c++

67
推荐指数
3
解决办法
6万
查看次数

C中的十六进制浮点常数

0x0.3p10 代表什么价值?

p上面的陈述中含义是什么?

c hex constants

40
推荐指数
1
解决办法
1万
查看次数

任意表达式中的单冒号?

我需要弄清楚这个混淆的 C++ 代码(由其他人编写)做了什么。除了一个棘手的部分,我已经想通了几乎所有的东西:

bool part1(char *flag)
{
    int *t = (int *) memfrob(flag, 8);

    unsigned int b[] = {3164519328, 2997125270};

    for (int i = 0; i < 2; b[i] = ~b[i], ++i);

    return !(0<:t:>-0<:b:>+1<:t:>-1<:b:>);
}
Run Code Online (Sandbox Code Playgroud)

这个函数的 return 语句是怎么回事?我不知道这些冒号是什么意思...

我试过用谷歌搜索 C++ 中的冒号运算符是做什么的,但只找到了关于类构造函数和条件表达式的答案,这似乎与这个问题无关。

c++ colon digraphs

5
推荐指数
1
解决办法
88
查看次数

什么X >> = N呢?

我有这个代码:

tmp = (uint)len;
writer.CurPosition = value + 1;
do
{
    value++;
    writer.dest.WriteByte((byte)((tmp & 0x7F) | 0x80));
} while ((tmp >>= 7) != 0);
Run Code Online (Sandbox Code Playgroud)

但我不明白是怎么tmp >>= 7运作的?

c# bitwise-operators

3
推荐指数
1
解决办法
105
查看次数

标签 统计

c++ ×4

c ×3

bitwise-operators ×1

boolean ×1

c# ×1

char ×1

colon ×1

constants ×1

digraphs ×1

hex ×1

sizeof ×1