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

Jim*_* Lu 7 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...
}
Run Code Online (Sandbox Code Playgroud)

for循环中的语句是否保证按顺序运行?

例如,m_matchBase = match->requestedBase保证运行之后match = match->next

Mar*_*k B 8

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

  • 碰撞很好 (2认同)

Sha*_*our 5

表达式将左起进行评估,以权会有一个序列点的每个评估之后.在C语言中,没有C99标准部分迭代语句草案声明的for语句的语法是:6.8.5

for(表达式opt ;表达式opt ;表达式opt)语句

因此,,每组表达式中的逗号运算符将只是一个分隔符,这意味着将从左到右计算赋值.这在6.5.17 Comma运算符部分中有所说明:

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

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