Порядок этого оператора C хорошо определен?

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

Это связано со следующим кодом:

for (match         = root,
     m_matchBase   = match->requestedBase,
     m_matchLength = match->length;

     match != NULL;

     match         = match->next,
     m_matchBase   = match->requestedBase,
     m_matchLength = match->length)
{
    if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base)
        break;
    // other stuff...
}

Гарантированно ли выполняется оператор в цикле for?

Например, это m_matchBase = match->requestedBase гарантированно бежать за match = match->next?

4 ответа

Решение

Да, оператор запятой (который используется здесь) будет выполнять последовательность операций. Это означает, что ваш цикл, скорее всего, потерпит крах, когда match->next становится нулевым

Выражения будут оцениваться слева направо, и после каждой оценки будет точка последовательности. В C грамматика для утверждения без декларации из проекта стандартного раздела C99 6.8.5 Итерационные операторы это:

оператор for (выражениеopt; выражениеopt; выражениеopt)

Итак , в каждом наборе выражений будет оператор запятой, а не просто разделитель, что означает, что назначения будут оцениваться слева направо. Это описано в разделе 6.5.17 Запятая оператор, который говорит:

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

Является ли это обслуживаемым кодом, это другой вопрос, важно отметить, что когда match>next возвращается NULL Вы будете вызывать неопределенное поведение в последующих подвыражениях. Что, вероятно, может послужить доказательством того, что это плохой выбор стиля, поскольку его легко пропустить и трудно проверить в текущей форме.

Да, см. Стандарт C++11 (5.18):

Пара выражений, разделенных запятой, оценивается слева направо; левое выражение является выражением отброшенного значения

Да.

Левый операнд оператора запятой оценивается как пустое выражение; существует последовательность между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение.

&& Оператор также имеет точку последовательности.

Другие вопросы по тегам