对C ++中的类型转换感到困惑

时间:2010-03-30 12:00:24

标签: c++ types type-conversion

在C ++中,以下几行让我感到困惑:

int temp = (int)(0×00);

int temp = (0×00int);

这两行之间有什么区别?

5 个答案:

答案 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

其次会导致编译错误。

当扫描程序看到时,它希望它跟随十六进制数字,但当它看到i不是有效的十六进制数字时,它会给出错误。

答案 3 :(得分:1)

第一个将十六进制值0x00作为int,并使用它来初始化变量temp。

第二个是编译错误。

答案 4 :(得分:0)

第一行是有效的C ++,基本上等同于

int temp = 0; 

而第二个将无法编译(如此处所有人所建议的那样)。