Обсуждение файла: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) (обсуждение)