【问题标题】:Does this contain a sequence point?这是否包含序列点?
【发布时间】:2015-10-12 17:03:05
【问题描述】:

在最近的帖子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。但这似乎既不包含序列点,所以它一直有效将是巧合(运气),我无法相信。

谁能帮我解释一下?

【问题讨论】:

    标签: c sequence-points


    【解决方案1】:

    结果

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

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

    结果

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

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

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

    【讨论】:

    • =(赋值)不是定义为从右到左求值吗?不应该总是在 LHS 之前评估 RHS 吗?或者这只是在执行++ 时?
    • 评估 LHS 以确定需要设置 RHS 的值的位置。评估 RHS 以确定分配给 LHS 的值。因此,它们可以按任何顺序进行评估。这些值作为副作用增加。这只发生在下一个序列点之前。有关详细信息,请参阅stackoverflow.com/questions/1895922/…
    • 更多关于序列点的问答:stackoverflow.com/search?q=%5Bc%5D+sequence+points.
    【解决方案2】:

    你的操作结果:

    *s1++ = *s2++;
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2012-05-24
      • 2021-10-05
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多