Явное (длинное длинное) преобразование арифметического выражения возвращает 0 - PullRequest
0 голосов
/ 25 июня 2018

Когда я умножаю значение 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 голосов
/ 25 июня 2018

Приведения в стиле C имеют более высокий приоритет операторов, чем арифметические операторы, такие как оператор умножения.

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

Для справки:

Цитата оттуда (выделено мое):

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

0 голосов
/ 25 июня 2018

Вы кастуете 0,1 на long long.Который равен 0. Это будет работать:

(long long) (0.1 * ...)
...