这是否包含序列点?

时间:2015-10-12 17:03:06

标签: c sequence-points

在最近的帖子C string to uppercase in C and C++中,功能:

void strupp(char* beg)
{
    while (*beg++ = toupper(*beg));
}
当给出'foobar'时,

显示'OOBAR'的不良结果,答案解释了表达式中没有“序列点”。现在我一直在使用

char *s1=strTo, *s2= strFrom;
while (*s2) *s1++ = *s2++;

理解它意味着获得正确部分的值(*s2),增量s2;将获得的值分配给*s1并增加s1。但似乎这既不包含一个序列点,所以它一直有效将是巧合(运气),我无法相信。

任何人都可以帮助我解释一下吗?

2 个答案:

答案 0 :(得分:2)

的结果
while (*beg++ = toupper(*beg));

取决于首先评估LHS还是首先评估RHS。

的结果
while (*s2) *s1++ = *s2++;

不依赖于首先评估LHS还是首先评估RHS。

这是至关重要的区别。因此,缺少序列点在第一种情况下很重要,但在第二种情况下无关紧要。

答案 1 :(得分:1)

您的操作结果:

*s1++ = *s2++;

不取决于何时完成增量。因此,缺少序列点不会造成任何问题。