Скобка инициализации двойного с помощью выражения? - PullRequest
0 голосов
/ 14 января 2019

Я не привык использовать инициализацию скобок, но я решил, что начну переносить свой код, так как он был в стандарте с c ++ 11.

Возникает один вопрос: верно ли следующее выражение?

double MyFunction(double a,double b,int c)
{
    double dx{(a-b)/c};
    //do things to dx
    return dx;
}

Я инициализирую double, dx, используя инициализацию фигурной скобки, которая основана на математическом выражении «двойного» вычитания и целочисленного деления. Это просто кажется неправильным, как будто это может привести к неопределенному поведению. Является ли указанная выше функция «правильной» и будет ли она возвращать ожидаемое значение без усечения?

В качестве альтернативы, я мог бы попробовать double dx{(a-b)/double(c)}; или double dx = (a-b)/(double(c));

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Хотя это просто неправильно

Тогда не стесняйтесь этого не делать. Инициализация копирования все еще в C ++ 11 и никуда не денется.

как будто это может привести к неопределенному поведению

Если c==0, то поведение будет действительно неопределенным (насколько это касается стандарта. Однако для большинства реальных компиляторов деление с плавающей точкой на ноль не является UB). В противном случае нет.

Является ли вышеуказанная функция «правильной»

Выражение правильно сформировано (если бы не ваш компилятор, вам нужно было бы об этом сказать), и оно имеет четко определенное поведение (возможно, с предварительным условием c!=0).

и вернет ли оно ожидаемое значение без усечения?

Зависит от того, что вы ожидаете.

0 голосов
/ 14 января 2019

double dx{(a-b)/c}; в порядке. Выражение

(a-b)/c

имеет тип double с левой стороны подразделения и int с правой стороны подразделения. Посредством обычных арифметических преобразований int с правой стороны преобразуется в double, чтобы соответствовать левой стороне, и затем происходит деление. Это означает, что вы действительно делите double на double.

...