Программа суммирования С++

Я создал две функции и вернул значение в основную часть.

#include <iostream>
using namespace std;
int a =8;
int g(){a++; return a-1;}
int f(){a++; return a;}

int main (){
 cout << g()+f()<</iostream>
<p> Я не думаю, что выход будет <span>18,</span> но не <span>17</span>. Мне было интересно, может ли кто-нибудь объяснить это подробно для меня? Спасибо за вашу помощь</p>
3 ответа

Прежде всего обратите внимание, что аргументы operator + не секвенированы, что означает, что g() и f() могут быть оценены в двух порядках, g() за которыми следуют f() или f() за которыми следует g(). Это просто случается, что в данном конкретном случае, оба этих порядки дают тот же результат, 18, достигаются различными способами:

  • g() за которым следует f(): g увеличивает a до 9 и возвращает 8. f увеличивает a до 10 и возвращает 10. Сумма составляет 18.

  • f() за которым следует g(): f увеличивает a до 9 и возвращает 9. g увеличивает a до 10 и возвращает 9. Сумма составляет 18.


Это неопределенное поведение. Два вызова функций могут быть оценены компилятором в любом порядке.

Из стандарта: N3797, 1.9, пункт 15

За исключением тех случаев, когда отмечено, оценки операндов отдельных операторов и подвыражений отдельных выражений не имеют последствий. [Примечание. В выражении, которое оценивается более одного раза во время выполнения программы, неоперабельные и неопределенно упорядоченные оценки его подвыражений не обязательно должны выполняться последовательно в разных оценках. -End note] Вычисления значений операндов оператора секвенируются перед вычислением значения результата оператора. Если побочный эффект скалярного объекта не влияет на какой-либо другой побочный эффект на один и тот же скалярный объект или вычисление значения, используя значение одного и того же скалярного объекта, поведение не определено.


Поскольку переменная 'a' объявлена глобально, ее область действия находится во всей программе. В g() значение a увеличивается до 9 и возвращается a-1, т.е. 8. Оператор return не влияет на значение a. В f() значение a увеличивается на 10 и возвращается. Теперь оператор печати будет выглядеть как cout << 8 + 10; и выводит 18 на консоль.

licensed under cc by-sa 3.0 with attribution.