这个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++两者都应该同意)。