Преобразование констант типа C++ в арифметике
Фон
Я пытаюсь учиться в C++11 с Clang на Mac.
Вопрос
Как сказано в книге, когда тип float встречается с int или строчными буквами в арифметике, последний будет преобразован в float. Это верно в таких случаях, как:
cout << 9.0 / 5 << endl;
Результат дает 1.8000
, но когда я пытаюсь использовать суффикс, чтобы обеспечить тип для констант, как:
cout << 9.0f / 5i << endl;
Результат дает 1
, Интересно, почему? Есть ли другие правила или механизм за этим?
1 ответ
С помощью i
Суффикс - это расширение, которое указывает мнимую константу, а не целое число, которое также поддерживается gcc
, Без предупреждений включает clang
будет просто интерпретировать 5i
как комплексное число. С включенным предупреждением (в частности, -Wconversion) выдается следующее предупреждение:
warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
std::cout << 9.0f / 5i << std::endl;
^
warning: implicit conversion discards imaginary component: '_Complex float' to 'bool' [-Wconversion]
std::cout << 9.0f / 5i << std::endl;
~~~ ~~~~~^~~~
Так что, похоже, нет перегрузки для _Complex
поэтому результат конвертируется в bool. Мы можем увидеть это более ясно, используя следующие примеры:
float f = (9.0f / 5 + 0i) ;
std::cout << f << std::endl ;
какие выводы 1.8
,
Если вы просто хотите использовать литерал типа int, тогда суффикс не требуется, остальные интегральные суффиксы u, l, ul, ll, ull
за unsigned, long, unsigned long, long long and unsigned long long
соответственно.
Итак, в вашем случае:
9.0f / 5
будет то, что вы хотите, если вы хотите застраховать 9.0
интерпретируется как число с плавающей запятой, в противном случае оно будет интерпретировано как двойное число.
5
будет преобразован в поплавок, так как /
Оператор выполнит обычные арифметические преобразования для своих операндов.