鉴于这x是一个int以数字5作为其值的类型变量,请考虑以下语句:
int y = !!x;
Run Code Online (Sandbox Code Playgroud)
这就是我认为它发生的事情:x隐式地转换为a bool并且执行第一个否定,之后进行最后的否定,所以一个演员和两个否定.
我的问题是,不仅仅是使用bool(执行int y = (bool)x;代替int y = !!x)而不是使用双重否定,因为你正在执行两个否定.
我可能错了,因为我在Linux内核中看到了很多双重否定,但我不明白我的直觉出错了,也许你可以帮助我.
我有一个非常简单的程序,它只是无限地输出一个指向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进行编译,因此编译器不是问题(我猜).
我有一个.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) 我想将结果赋给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 ×2
c++ ×1
casting ×1
constants ×1
file-format ×1
function ×1
midi ×1
negation ×1
return-type ×1
return-value ×1
string ×1
volatile ×1