Явное (длинное длинное) преобразование арифметического выражения возвращает 0
Когда я умножаю long long
значение с double
значение, я получаю double
значение.
Чтобы преобразовать его обратно в long long
, Я использую (long long)
,
Но на выходе я получаю 0
когда это должно быть 10
,
Это мой код:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n = 100;
printf("%lld",(long long)0.1*n);
return 0;
}
Почему это? Как я могу это исправить?
2 ответа
Вы кастуете 0,1 на long long
, Который равен 0. Это будет работать:
(long long) (0.1 * ...)
Приведения в стиле C имеют более высокий приоритет операторов, чем арифметические операторы, такие как оператор умножения.
Таким образом, чтобы получить здесь ненулевой результат, вам нужно заключить круглые скобки в арифметическое выражение, чтобы оно было оценено до преобразования типа.
Для справки:
Цитата оттуда (акцент мой):
При синтаксическом анализе выражения оператор, который указан в некоторой строке таблицы выше с приоритетом, будет более тесно связан (как в скобках) со своими аргументами, чем с любым оператором, который указан в строке ниже, с более низким приоритетом.