这个C语句的顺序定义得好吗?

这个C语句的顺序定义得好吗?,c,sequence-points,C,Sequence Points,标题有点模糊,因为我真的不知道如何定义这个问题 它与以下代码有关: for (match = root, m_matchBase = match->requestedBase, m_matchLength = match->length; match != NULL; match = match->next, m_matchBase = match->requestedBase,

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

它与以下代码有关:

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(match=root,
m_matchBase=match->requestedBase,
m_matchLength=匹配->长度;
匹配!=NULL;
匹配=匹配->下一步,
m_matchBase=match->requestedBase,
m_matchLength=匹配->长度)
{
if(m_matchBase m_base)
打破
//其他东西。。。
}
for循环中的语句是否保证按顺序运行

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

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

逗号运算符的左操作数作为空表达式计算;有一个 其求值与右操作数求值之间的序列点。然后右转 计算操作数;结果有其类型和值

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

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

由逗号分隔的一对表达式从左到右求值;左侧表达式是一个已丢弃的表达式- 值表达式

表达式将从左到右求值,每次求值后将有一个序列点。在C语言中,C99标准草案第6.8.5节迭代语句中没有声明的for语句的语法是:

for(expressionopt;expressionopt;expressionopt)语句

因此,每组表达式中的
将是一个分隔符,而不仅仅是一个分隔符,这意味着赋值将从左到右进行计算。这在第6.5.17节“
6.5.17
逗号运算符”中有说明:

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


这是否是可维护代码是另一个问题,需要注意的是,当
match>next
返回
NULL
时,将在后续子表达式中调用。这可能是某种方式证明这是一个糟糕的选择风格,因为它很容易错过和难以检查在当前的形式。< / P>是的,它是保证的,这是C还是C++?挑一个。既然你只在标题中提到“C”,现在我假设你是说你所说的,我会适当地编辑你的标签。@ JohnDibling,我认为这对C和C++都适用,不是吗?我认为这两种语言在这类基本问题上应该是一致的。@ShafikYaghmour,我知道它们是不同的语言。但是,对于这个特殊的问题,我认为它适用于两种语言(C和C++两者都应该同意)。