请解释一下这个增量减量运算符的代码

请解释一下这个增量减量运算符的代码

以下是我在 ubuntu 13.10 中运行的代码。代码:-

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

输出:-

    i=21 j=11 
    i=22 j=33

从逻辑上讲,根据规则,答案应该是:-

    i=22 j=11
    i=23 j=35

当我在 ubuntu 12.10 中运行此代码时,我得到了正确的答案,即上面的答案。请解释一下发生了什么?

答案1

这是未定义或依赖于实现的行为的典型结果。当您的表达式在等式的两个位置上都改变变量时(以及许多其他情况),您基本上做错了。仅仅因为它在一个编译器版本上“有效”并不意味着它会在下一个版本中给出相同的答案。仔细阅读语言规范,看看哪些事情是未定义的或依赖于实现的,并避免它们。这两个答案都不是“正确的”,它们是未定义的。不同的答案甚至可能由同一编译器的不同优化触发。


实际上,您应该使用编译器警告标记和静态分析工具(如 valgrind 或 Purify)来标记这些事情。除非您理解“左值”和“右值”等术语的含义,否则仅使用运算符优先级表不足以真正理解某些前置/后置固定增量/减量运算符的情况。

相关内容