c ++ 11 — преобразование констант типа 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 как комплексное число. С включенным предупреждением (конкретно -конверсия) выдает следующее предупреждение:

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

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector