Преобразование константного типа С++ в арифметике

Задний план

Я пытаюсь учиться на С++ 11 с clang на mac.

Вопрос

Как сказано в книге, когда тип float соответствует арифметике int или lower case, последний будет преобразован в 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 также будет преобразован в float, так как оператор / будет выполнять обычные арифметические преобразования на нем.

licensed under cc by-sa 3.0 with attribution.