Преобразование констант типа 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 будет преобразован в поплавок, так как / Оператор выполнит обычные арифметические преобразования для своих операндов.

Другие вопросы по тегам