порядок оценки точности - PullRequest
0 голосов
/ 03 марта 2020
streamsize prec = cout.precision();  
std::cout << setprecision(3) << 10.000001 << setprecision(prec);

В c ++, "хотя реализация требуется для выполнения оператора << слева направо, не требуется оценивать операнды в каком-либо определенном порядке c."

Тогда, как мы можем гарантировать, что setprecision(3) оценивается раньше setprecision(prec)?

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы уже сделали это. Конечно, фактический setprecision(prec) может быть оценен первым. Но он ничего не делает, пока не «сместится» в поток. Выполнение:

setprecision(prec);

ничего не делает (полезно) само по себе, это только когда operator<< потока вызывается с ним как аргумент, что что-то происходит, и, как вы заметили, вызов сериала << имеет гарантированный порядок оценки слева направо. Так что он уже делает то, что вы хотите; setprecision(prec) может быть построен рано, но это никак не повлияет на поток, пока setprecision(3) не изменит поток и не будет записано 10.000001.

0 голосов
/ 03 марта 2020

До C ++ 17,

оценка из setprecision(prec) действительно может быть оценена до setprecision(3)

Из C ++ 17,

19) В выражении оператора сдвига E1<<E2 и E1>>E2 каждое вычисление значения и побочный эффект E1 секвенируются перед каждым вычислением значения и побочным эффектом E2

Но в любом случае, в любом случае, std :: setprecision создает только (неопределенный) объект, который после использования с stream << unspecified_object ведет себя так, как если бы str.precision(n) был выполнен.

Таким образом, порядок оценки между setprecision(prec) и setprecision(3) не имеет значения.

...