在C ++中,以下几行让我感到困惑:
int temp = (int)(0×00);
int temp = (0×00int);
这两行之间有什么区别?
答案 0 :(得分:12)
两者都无效,因为您使用的是×
而不是x
:
test.cpp:6: error: stray '\215' in program
test.cpp:6: error: expected primary-expression before "int"
test.cpp:6: error: expected `)' before "int"
但即便解决这个问题,第二个仍然无效的C ++因为你不能写0x00int
:
test.cpp:6:13: invalid suffix "int" on integer constant
第一个是有效的(在将×
更改为x
之后)并将值0赋给temp。这里不需要强制转换 - 你不需要强制转换只是因为常量是用十六进制编写的。你可以写:
int temp = 0x00;
答案 1 :(得分:3)
施展方式:
int temp = (int)0x00; // Standard C-style cast
int temp = int(0x00); // Function-style cast
int temp = static_cast<int>(0x00); // C++ style cast, which is clearer and safer
int temp = reinterpret_cast<int>("Zero"); // Big-red-flag style unsafe cast
static_cast和reinterpret_cast的有趣之处在于,一个好的编译器会在你错误地使用它们时发出警告,至少在某些情况下是这样。
例如,如果您尝试将reinterpret_cast 0x00重新设置为int,则Visual Studio 2005将抛出错误,因为该转换是以安全的方式提供的。实际的消息是:“转换是一种有效的标准转换,可以隐式执行,也可以使用static_cast,C风格的转换或函数式转换”。答案 2 :(得分:1)
第一个会将0
分配给temp
其次会导致编译错误。
当扫描程序看到0×
时,它希望它跟随十六进制数字,但当它看到i
不是有效的十六进制数字时,它会给出错误。
答案 3 :(得分:1)
第一个将十六进制值0x00作为int,并使用它来初始化变量temp。
第二个是编译错误。
答案 4 :(得分:0)
第一行是有效的C ++,基本上等同于
int temp = 0;
而第二个将无法编译(如此处所有人所建议的那样)。