标题有点模糊,因为我真的不知道如何定义这个问题。
它与以下代码有关:
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
之后运行吗?
答案 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表达式;有一个 其评估与右操作数之间的序列点。然后是正确的 操作数被评估;结果有其类型和价值。
&&
运算符也有一个序列点。