这个C语句的顺序是否定义良好?

时间:2014-01-17 19:05:30

标签: c sequence-points

标题有点模糊,因为我真的不知道如何定义这个问题。

它与以下代码有关:

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 个答案:

答案 0 :(得分:8)

是的,逗号运算符(这里使用的是运算符)将对操作进行排序。这意味着当match->next变为空时,您的循环很可能会崩溃。

答案 1 :(得分:5)

表达式将从左到右进行评估,每次评估后都会有一个序列点。在 C for语句的语法中没有来自草案 C99 标准部分6.8.5 迭代语句的声明是:

  

for(expression opt ; expression opt ; expression opt )语句

因此,每组表达式中的,将是comma operator而不是仅仅是分隔符,这意味着将从左到右评估分配。这将在6.5.17 逗号运算符部分中介绍:

  

逗号运算符的左操作数被计算为void表达式;有一个   评估后的序列点。然后评估右操作数;结果有其类型和值

这是否是可维护代码是另一个问题,请务必注意,当match>next返回NULL时,您将在后续子表达式中调用undefined behavior。这可能是某种方式来证明这是一个糟糕的风格选择,因为它很容易错过,很难检查当前的形式。

答案 2 :(得分:3)

是的,请参阅c ++ 11标准(5.18):

  

用逗号分隔的一对表达式从左到右进行评估;左表达式被丢弃 -   价值表达

答案 3 :(得分:2)

  

逗号运算符的左操作数被计算为void表达式;有一个   其评估与右操作数之间的序列点。然后是正确的   操作数被评估;结果有其类型和价值。

&&运算符也有一个序列点。