Обсуждение файла:Cpp.png

Материал из Lurkmore
Перейти к навигацииПерейти к поиску

Брр, а 11-то откуда вылезло?

Никаким образом 11 не может получиться.

Как и сказано в статье, дело в точках следования и порядке операторов. В C++ преинкремент возвращает ссылку на переменную (подробности на англ. http://www.learncpp.com/cpp-tutorial/97-overloading-the-increment-and-decrement-operators/), поэтому
<source lang="cpp">int i{5}; std::cout << ++i + ++i;</source>
покажет 14 на любом компиляторе. А с длинным примером сложнее. В коммах перед оператором порядок выполнения для g++
<source lang = "cpp">i /*8*/= /*1*/++i /*3*/+ /*2*/++i /*5*/+ /*4*/++i /*7*/+ /*6*/++i;</source>
и для VC++
<source lang = "cpp">i /*8*/= /*1*/++i /*5*/+ /*2*/++i /*6*/+ /*3*/++i /*7*/+ /*4*/++i;</source>
То есть g++ вычисляет инкремент в момент, когда он требуется для проведения сложения, а VC++ анализирует сразу все выражение и вычисляет инкременты.
На g++ получаем 2 + 2 + 3 + 4 = 11, так как в первом сложении обе части – ссылки, они инкрементятся, вычисляется значение, временно сохранияется, а далее уже инкрементируется только правая часть. Об этом неплохо написано в обсуждении к статье.
Чтобы g++ тоже вычислял сначала все преинкременты,нужно поставить скобки таким образом
<source lang="cpp">i = ++i + (++i + (++i + ++i));</source>
Хз с чем это связано, может с ассоциативностью. — Sl6MUNl) (обсуждение)