Почему в этом коде нет нарушений правил точек последовательности? - PullRequest
0 голосов
/ 24 ноября 2018

Используемый компилятор: gcc 8.2

Командная строка: -Wall

Мое текущее понимание нарушения точки последовательности - это код, который каким-то образом зависит от порядка вычисления операндов / подвыражений вданное выражение.Это так, потому что порядок вычисления операндов в выражении не определен, как отмечено здесь .Таким образом, такой код:

a = 5;
b = a + ++a;

является нарушением и перехватывается -последовательностью , поскольку в результате имеется неоднозначность, т. Е. Должно быть (5 + 6) или (6 + 6)Я думаю, что в приведенном ниже коде есть аналогичная неоднозначность, так как мы не можем знать, будет ли 2-й ++ a оцениваться до 1-го:

#define MIN(a, b) (((a) < (b)) ? (a) : (b))

int use() 
{ 
    int min;
    int a = 4, b = 5;
    min = MIN(++a, b);
    //min = ((++a) < b) ? (++a) : b;
    return min;
}

Я явно что-то упускаю, так как этот код не предупреждает меня о -Wseqeuence-точка .Может кто-нибудь, пожалуйста, помогите мне понять, что?Обратите внимание, что я специально определил MIN как есть.

1 Ответ

0 голосов
/ 24 ноября 2018

В соответствии со стандартом ISO C11 существует точка последовательности между оценкой предиката троичного / условного оператора и любой из его альтернатив, в зависимости от того, какой из них оценивается.Поэтому два ++a упорядочены по отношению друг к другу с помощью промежуточной точки последовательности.

§6.5.15 Условный оператор

Синтаксис

1.

  conditional-expression:
      logical-OR-expression
      logical-OR-expression ? expression : conditional-expression

[...]

Семантика

Первый операнд оценивается;между оценкой и оценкой второго или третьего операнда существует точка последовательности (в зависимости от того, что оценивается).Второй операнд оценивается, только если первый сравнивается с неравным 0;третий операнд оценивается, только если первый сравнивается равным 0;Результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованное в тип, описанный ниже.
...