Быстрый совет по "приведению" переменных? Очень короткая функция, требующая регулировки - PullRequest
0 голосов
/ 07 октября 2011

У меня есть код на C ++ в следующем формате:

    void calculate(int a, float b, long c) {

    long long result = (a / b) * (1000 / c);
    assert(result > 0);

    // more code...
    }

Однако утверждение assert не выполняется. Дано, что a, b и c - все значения, которые являются положительными. Тогда я полагаю, что «результат» по какой-то причине становится «результатом == 0». Есть ли в логике приведенных здесь преобразований типов что-то, что приводит к сбою моего кода?

Я новичок в C ++, поэтому ответ может показаться очевидным ...

1 Ответ

4 голосов
/ 07 октября 2011

Если c > 1000, то выражение (1000/c) становится нулевым из-за целочисленного деления. Здесь выполняется целочисленное деление, поскольку оба операнда являются целочисленными типами.

В результате выражение (a / b) * (1000 / c) становится равным нулю, поэтому значение result становится равным нулю, вызывая утверждение.

То же самое произойдет, если b > a, по той же причине, что и выше.

Если целочисленное деление не то, что вам нужно, перепишите выражение следующим образом:

long long result = long long((float(a) / b) * (1000.0f / c)); 

Это вызывает деление с плавающей запятой вместо целочисленного деления. Значения a и c будут преобразованы в тип с плавающей точкой для расчета результата.

...