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

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

例如,m_matchBase = match->requestedBase保证在match = match->next?

4

4 回答 4

8

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

于 2014-01-17T19:09:13.447 回答
5

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

for ( 表达式选择; 表达式选择; 表达式选择) 语句

因此,,每组表达式中的 将是一个逗号运算符,而不仅仅是一个分隔符,这意味着赋值将从左到右进行评估。这在6.5.17 逗号运算符部分中有介绍,它说:

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

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

于 2014-01-17T19:11:54.860 回答
3

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

一对用逗号分隔的表达式从左到右计算;左表达式是弃值表达式

于 2014-01-17T19:10:52.427 回答
2

是的。

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

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

于 2014-01-17T19:09:35.180 回答