Неопределенное поведение подвыражений - PullRequest
2 голосов
/ 17 сентября 2011

Приводит ли это к неопределенному поведению, потому что порядок оценки будет неопределенным?

int i = 0, j = 0, k = 0;
int result = i++ + ++j + k++;

Ответы [ 8 ]

5 голосов
/ 17 сентября 2011

Нет, результат оценки не зависит от неопределенного порядка вычисления подвыражений.

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

4 голосов
/ 17 сентября 2011

Порядок оценки не указан, но кого это волнует?Каждый операнд действует на совершенно отдельный объект.Здесь ничего не определено.

1 голос
/ 17 сентября 2011

Правило состоит в том, что результаты не указываются, если вы изменяете переменную более одного раза.Вы не сделали этого в своем примере.

1 голос
/ 17 сентября 2011

Нет, поведение совершенно четко определено: j увеличивается, затем выполняется добавление, затем i и k увеличиваются.Единственное, что не указано, - это порядок выполнения приращений i и k.Постусловие: i==1, j==1, k==1, result==1.

0 голосов
/ 17 сентября 2011

Здесь:

int result = i++ + ++j + k++;

Эквивалент тоже:

<SP>
(a1)int t1 = i;     // i++ part one: The result of post-increment is the original value
(a2)     i = i + 1; // i++ part two: the increment part separated from the result
(b1)     j = j + 1;
(b2)int t2 = j;     // The result of pre-increment is the new value
(c1)int t3 = k;     // k++ part one: The result of post-increment is the original value
(c2)     k = k + 1;
(d) int t4 = t1 + t2;
(e) int t5 = t3 + t4;    
(f) int result = t5;
<SP>

Ограничения:

(a1) is before (a2)
(a1) is before (d)
(b1) is before (b2)
(b2) is before (d) 
(c1) is before (c2)
(c1) is before (e)
(d)  is before (e)
(e)  is before (f)

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

0 голосов
/ 17 сентября 2011

Нет, это классическая / хорошо известная проблема с последовательностью точек c ++, более подробную информацию смотрите здесь. http://en.wikipedia.org/wiki/Sequence_point

0 голосов
/ 17 сентября 2011

Здесь результат будет всегда 1. Значения j, k и i будут равны 1. Кроме того, обратите внимание, что разделителем для объявления нескольких переменных является ,, а не ;:

int i=0, j=0, k=0;
0 голосов
/ 17 сентября 2011

Здесь хорошо, потому что вы не используете одну и ту же переменную дважды.

То, что у вас есть, эквивалентно:

int i = 0, j = 0, k = 0;
++j;
int result = i + j + k;
++i;
++k;

Если бы вместо этого было int result = i++ + ++i + i++;, у вас возникла бы проблема, потому что порядок приращений не определен, и вы зависите от этого порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...