2014-01-17 2 views
7

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

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

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... 
} 

ли операторы в цикл гарантированно выполняться последовательно?

Например, m_matchBase = match->requestedBase Гарантировано выполнение после match = match->next?

+1

Да, это гарантировано, [дальнейшие указания] (http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) –

+0

http://stackoverflow.com/questions/52550/what -does-the-operator-do-in-C# 52558 – clcto

+0

Является ли это C или C++? Выбери один. Поскольку вы упомянули только «C» в названии, на данный момент я собираюсь предположить, что вы имели в виду то, что вы сказали, и я правильно отредактирую ваши теги. –

ответ

8

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

+2

хороший улов с крушением – bolov

+0

приятный улов! благодаря –

2

Да.

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

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

3

Да, смотрите C++ 11 стандарт (5,18):

Пара выражений, разделенных запятой вычисляется слева направо; левое выражение является выражением discarded- значение

5

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

для (выражения неавтоматического; выражение неавтоматического; выражение opt) справка

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

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

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

Смежные вопросы