Я пытаюсь учиться в C ++ 11 с Clang на Mac.
Как сказано в книге, когда тип float встречается с int или строчными буквами в арифметике, последний будет преобразован в float. Это верно в таких случаях, как:
cout << 9.0 / 5 << endl;
Результат дает 1.8000
, но когда я пытаюсь использовать суффикс, чтобы обеспечить тип для констант, как:
cout << 9.0f / 5i << endl;
Результат дает 1
, Интересно, почему? Есть ли другие правила или механизм за этим?
С помощью i
как суффикс расширение который указывает мнимую константу, а не целое число, которое также поддерживается gcc
, Без предупреждений включает clang
будет просто интерпретировать 5i
как комплексное число. С включенным предупреждением (конкретно -конверсия) выдает следующее предупреждение:
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
,
Если вы просто хотите ИНТ буквальный, то суффикс не требуется, остальные интегральные суффиксы u, l, ul, ll, ull
за unsigned, long, unsigned long, long long and unsigned long long
соответственно.
Итак, в вашем случае:
9.0f / 5
будет то, что вы хотите, если вы хотите застраховать 9.0
интерпретируется как поплавок в противном случае это будет интерпретироваться как двойной.
5
будет преобразован в поплавок а так как /
Оператор выполнит обычные арифметические преобразования на его операндах.