【问题标题】:Why n++==--n always equal to 1? [duplicate]为什么 n++==--n 总是等于 1? [复制]
【发布时间】:2020-09-23 00:38:19
【问题描述】:

为什么n++==--n 总是等于 1?以下代码给出的输出为 1。

#include <stdio.h>
int main(){
    int n=10;
    printf("%d\n",n++==--n);
}

无论n 是什么,输出始终为1。

【问题讨论】:

  • 运算符== 生成一个布尔值,在您的情况下为true,它由printf() 转换为值1。如果您尝试 printf()false,您将获得 0 的值
  • 这是一个未定义的行为。如果您启用所有警告,编译器甚至可能会警告您。 godbolt.org/z/SuAiyk
  • @AlexLop。为什么这是未定义的行为?
  • @Lucas 因为== 没有引入序列点,因此可以先评估左侧或右侧,并且标准没有定义它 ==> 未定义的行为。
  • @Lucas 不是真的。如果您有x + y++ - z,则基于优先级y++ 将首先执行,然后通过关联性(x + y) - z== 没有引入序列点,它检查双方是否相等(或不相等),无论您首先评估什么。因此,顺便说一下,在函数输出比较 foo() == boo() 的情况下,boo()foo() 将首先执行。你不能依赖这里的执行顺序。

标签: c post-increment pre-increment


【解决方案1】:

如果用gcc -Wall编译,会得到如下警告:

a.c: In function ‘main’:
a.c:4:20: warning: operation on ‘n’ may be undefined [-Wsequence-point]
     printf("%d\n",n++==--n);
                   ~^~

gcc 联机帮助页对此有很好的解释,开始的部分:

       -Wsequence-point
           Warn about code that may have undefined semantics because of violations of sequence
           point rules in the C and C++ standards.

[...etc...]

非常值得一读,因为它更详细地讨论了这些问题,尽管基本点是结果取决于操作的顺序,其顺序不受标准的完全约束,因此是未定义的。

如果不添加大量许可证信息以符合 GFDL,我可能无法在此处完整复制它。在https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html有一份副本

(重要信息:始终编译您的代码并打开编译器警告,但尤其是如果您看到可能出现意外行为。)

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    相关资源
    最近更新 更多