在最近的帖子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
。但似乎这既不包含一个序列点,所以它一直有效将是巧合(运气),我无法相信。
任何人都可以帮助我解释一下吗?
答案 0 :(得分:2)
的结果
while (*beg++ = toupper(*beg));
取决于首先评估LHS还是首先评估RHS。
的结果
while (*s2) *s1++ = *s2++;
不依赖于首先评估LHS还是首先评估RHS。
这是至关重要的区别。因此,缺少序列点在第一种情况下很重要,但在第二种情况下无关紧要。
答案 1 :(得分:1)
您的操作结果:
*s1++ = *s2++;
不取决于何时完成增量。因此,缺少序列点不会造成任何问题。