Явное (длинное длинное) преобразование арифметического выражения возвращает 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 имеют более высокий приоритет операторов, чем арифметические операторы, такие как оператор умножения.

Таким образом, чтобы получить здесь ненулевой результат, вам нужно заключить круглые скобки в арифметическое выражение, чтобы оно было оценено до преобразования типа.

Для справки:

Цитата оттуда (акцент мой):

При синтаксическом анализе выражения оператор, который указан в некоторой строке таблицы выше с приоритетом, будет более тесно связан (как в скобках) со своими аргументами, чем с любым оператором, который указан в строке ниже, с более низким приоритетом.

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