小编Gar*_*ain的帖子

为什么linux内核使用双逻辑否定而不是强制转换为bools?

鉴于这x是一个int以数字5作为其值的类型变量,请考虑以下语句:

int y = !!x;
Run Code Online (Sandbox Code Playgroud)

这就是我认为它发生的事情:x隐式地转换为a bool并且执行第一个否定,之后进行最后的否定,所以一个演员和两个否定.

我的问题是,不仅仅是使用bool(执行int y = (bool)x;代替int y = !!x)而不是使用双重否定,因为你正在执行两个否定.

我可能错了,因为我在Linux内核中看到了很多双重否定,但我不明白我的直觉出错了,也许你可以帮助我.

c casting negation

8
推荐指数
1
解决办法
390
查看次数

const volatile char字符串打印不正确

我有一个非常简单的程序,它只是无限地输出一个指向const volatile char的const指针; 它是这样的:

const volatile char* const str = "ABCDEFGHIJKL";

while(true) {
    cout << '\r' << str;
}
Run Code Online (Sandbox Code Playgroud)

问题是,运行此程序时,输出为1.有一种方法来解决这个问题,这是输出const_cast<char*>(str)代替str.

但是如果我做const_cast<volatile char*>(str)输出是1,就像在演员之前那样,所以我猜测1输出是由volatile关键字引起的,这很奇怪因为我认为volatile只会让编译器避免在该变量中进行优化,这应该是'改变它的价值.

因此,我的问题是世界是如何将1作为输出的.

注意:

我已经尝试在Ubuntu 16.04中使用GCC进行编译,在Windows 7中使用MinGW进行编译,因此编译器不是问题(我猜).

c++ string volatile

7
推荐指数
1
解决办法
293
查看次数

合成器在没有任何音符关闭事件的情况下可以很好地播放midi文件?

我有一个.mid文件-特别是这个文件。标题块中的Appart是Midi的相关部分。第一个轨道块仅包含元事件,并被描述为

4D 54 72 6B 00 00 00 52 // Track chunk #1 info

00 FF 58 04 04 02 18 08 // Meta event

00 FF 59 02 00 00 // Meta event

00 FF 51 03 15 CC 5B // Meta event

81 88 70 FF 51 03 16 E3 60 // Meta event

81 70 FF 51 03 1A 28 6E // Meta event

81 70 FF 51 03 1C 9C 38 // …
Run Code Online (Sandbox Code Playgroud)

midi file-format

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

将`log10(2)`的结果赋给常量

我想将结果赋给log10(2)常量.

我做到了

const float f = log10(2);
Run Code Online (Sandbox Code Playgroud)

它告诉我们Initializer element is not a constant expression.我还定义了一个新功能

const float Log10(float f) {
    return (const float)log10(f);
}
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨(为什么不呢?我也在使用log10函数)Type qualifiers are ignored on function's return type.这是否意味着没有可以返回常量的函数?那我怎么能做我想做的事呢?

编辑:

由于有些人有疑问,我包含了math.h头文件并将其链接-lm,但我-pedantic在gcc中使用该选项,并且它不接受它.

c constants function return-type return-value

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