2016-08-24 2 views
1

Допуская этот кодстанд :: соиЬ с несколькими изменяющимися переменными

int main(){ 
    int i=0, j=0; 

    cout << i << " " << f1(&i,&j) << " " << j << endl; 

    cout << i << " " << j << endl; 
} 

int f1(int *i, int *j){ 
    *i = 20; 
    *j = 30; 

    return 10; 
} 

В результате

20 10 0 
20 30 

Я озадачен, почему J будет 0, а я правильно показывает 20

EDIT: я прочитал о последовательности, но я до сих пор не знаю, как это объяснить. Должен ли я предполагать, что j оценивается сначала до того, как f1 оценивается, поэтому j равно 0, а i равно 20?

+6

Порядок оценки в C++ не указан. –

+0

Возможно, это не обман, а связанный: http://stackoverflow.com/questions/9566187/function-parameter-evaluation-order – Tas

+3

[Также был связан (если не дубликат)] (http://stackoverflow.com/questions/ 4176328/неопределенное-поведение-и-последовательность-точка). –

ответ

2

Вот вещь:

cout << i << " " << f1(&i,&j) << " " << j << endl; 

, если вы считаете, справа налево оценки, j был первоначально 0 и распечатаны. Затем вызывается f1 и значение j изменяется на 30. Но этот порядок оценки непредсказуем

+0

Значит, это означает, что порядок оценки полностью зависит от компилятора? –