2010-03-30 2 views
0

В C++, следующие строки у меня путать:Confused о преобразовании типов в C++

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

int temp = (0×00int); 

В чем разница между этими 2 строками?

+4

Откуда у вас этот код? –

+2

почему у вас возникло это сомнение? Int temp = (0 × 00int); '- why ???? – Vijay

+0

еще одна вещь, которую я узнал сегодня. Хотя технически вы можете использовать «(int)» для ввода текста, C++-путь должен был бы написать «static_cast » – thecoshman

ответ

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; 
+0

Чтобы уточнить немного, второй оператор сообщает компилятору, что вы хотите присвоить «temp» некоторое значение. Использование префикса «0x» сообщает ему, что это значение будет выражено в HexaDecimal. Допустимые символы для шестнадцатеричного числа: 1234567890abcdef. Теперь вы должны увидеть проблему в своем заявлении. – Poni

1

Первый присвоит 0 к temp

Второй приведет к ошибке компиляции.

Когда сканер видит , он ожидает, что за ним следуют шестнадцатеричные цифры, но когда он видит i, который не является допустимой шестнадцатеричной цифрой, он дает ошибку.

1

Первый принимает шестнадцатеричное значение 0x00 как int и использует его для инициализации переменной temp.

Вторая ошибка компиляции.

0

Первая строка является допустимым C++, который в основном приравнивают к

int temp = 0; 

, а второй один не будет компилироваться (как это было предложено все здесь).

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 является то, что хороший компилятор предупредит вас, когда вы используете их неправильно, по крайней мере, в некоторых сценариях.

Visual Studio 2005, например, выдаст ошибку, если вы попытаетесь переинтерпретировать 0x00 в int, потому что это преобразование доступно безопасным способом. Фактическое сообщение: «Преобразование - это стандартное стандартное преобразование, которое может выполняться неявно или с помощью static_cast, литья в стиле C или в стиле функции».

Смежные вопросы