c - 这是否包含序列点?

标签 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。但似乎这两者都不包含序列点,因此它一直有效将是巧合(运气),我无法相信。

有人可以帮我解释一下吗?

最佳答案

结果

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

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

结果

while (*s2) *s1++ = *s2++;

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

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

关于c - 这是否包含序列点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086538/

相关文章:

c - 服务器卡在从客户端缓冲区中连续选择和读取

c - 链表 malloc 内存泄漏

c - fgets 在没有接受输入的情况下失败

c - 在函数调用中,为什么逗号不是序列点?

c - 序列点和副作用 : Quiet change in C11?

c - 为什么这些构造使用增量前和增量后未定义的行为?

连接一个常量数组是独立于实现的吗?

c - 一个跟踪 CPU 时间和内存使用情况的 Linux shell

c++ - 未排序的值计算(a.k.a 序列点)

c++ - 未定义的行为和顺序点