2013-10-24 2 views
2

Я пытаюсь установить в уме раз и навсегда, как оцениваются выражения. И с этим моим поиском я придумал этот пример, который я не знаю, что делать.Пример оценочного примера

#include <iostream> 
using namespace std; 
typedef void(*func)(int); 

void r(int i) 
{ 
    cout << i << endl; 
} 
func f(int i) 
{ 
    cout << i << endl; 
    return &r; 
} 

int main() 
{ 
    int i = 0; 
    f(++i)(++i); 
    return 0; 
} 

Имея этот кусок кода, скомпилированного MVSC 2008 будет производить этот выход: 2 2. Тот же код, но скомпилирован с GCC 4.8.1 вызовет предупреждение (операция на я может быть определен) и будет производить этот вывод: 1 2.

Что я пытаюсь понять, почему gcc 4.8.1 считает, что может быть случай неопределенного поведения? Побочные эффекты обоих предварительных приращений секвенированы относительно друг друга.

Приветствия, Андрей

ответ

7

побочные эффекты обоих предварительных приращений секвенируют по отношению друг к другу.

Нет, они не являются. Каждая оценка аргументов секвенируется перед ее вызовом функции, а вызовы функций упорядочиваются друг с другом; но оба они могут быть оценены до первого вызова, и в этом случае нет ничего, что могло бы их упорядочить друг с другом.

2

это зависит от того, что вы имеете в виду под «преинкремента» ... вы читаете это следующим образом:

++i 
f(i) 
     ++i 
f (i) (i) 

Но вы могли бы так же, как легко это сделать:

++i 
     ++i 
f(i) 
f(i) (i) 

I не думайте, что спецификация требует того или другого.

Смежные вопросы