这是否包含序列点?

Does this contain a sequence point?

最近post,函数:

void strupp(char* beg)
{
    while (*beg++ = toupper(*beg));
}
当给出 'foobar' 并在表达式中解释 "there is no sequence point" 的答案时,

显示了 'OOBAR' 的不良结果。现在我一直在用

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

理解就是获取右边部分(*s2)的值,自增s2;将获得的值分配给 *s1 并递增 s1。但是好像这两者都不包含序列点,所以它一直有效是巧合(运气),我不敢相信。

谁能帮我解释一下?

您的操作结果:

*s1++ = *s2++;

不依赖于增量何时完成。所以序列点的缺失不会造成任何问题。

结果

while (*beg++ = toupper(*beg));

取决于是先评估左手还是先评估右手。

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

不依赖于先计算左轴还是先计算右轴。

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