这是否包含序列点?
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++;
不依赖于先计算左轴还是先计算右轴。
这是关键的区别。因此,缺少序列点在第一种情况下很重要,但在第二种情况下无关紧要。
最近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++;
不依赖于先计算左轴还是先计算右轴。
这是关键的区别。因此,缺少序列点在第一种情况下很重要,但在第二种情况下无关紧要。