Порядок этого оператора 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):
Пара выражений, разделенных запятой, оценивается слева направо; левое выражение является выражением отброшенного значения
Да.
Левый операнд оператора запятой оценивается как пустое выражение; существует последовательность между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение.
&&
Оператор также имеет точку последовательности.