一直在学习 发表于 2021-3-7 19:46:10

含有自增运算的输出

int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
输出结果为8,8,7,8,-7,-8。
按照结果的正负看,应该是从左到右依次输出的。但第一个为什么是8?
如果直接
int i=8;
printf("%d\n",++i);
输出是9???

巴巴鲁 发表于 2021-3-7 20:24:09

研究第一个问题没有必要
第二个是++i,i先加1再执行其他的,i++先执行运算,再+1

4goodworld 发表于 2021-3-7 21:34:53

建议看看这个
<font color="red">[已解决]</font>自增
https://fishc.com.cn/thread-155977-1-1.html
(出处: 鱼C论坛)
主要是编译器的原故,

墙里秋千墙外荡 发表于 2021-3-7 22:32:15

本帖最后由 墙里秋千墙外荡 于 2021-3-7 22:48 编辑

不同的编译器对于printf()函数的解释不同,有的编zhi译器解释为从左到右执行,而有的则解释为从右到左执行。对于VC6.0就是解释成从右到左执行的。
但是这并不意味着在VC6.0下执行结果就是8,7,7,8,-7,-8,出于某方面的考虑VC6.0要执行多余两个++或--后才会改变变量的值,具体的可以看汇编代码(VC6.0生成)

; 4    :   int i=8;

        mov        DWORD PTR _i$, 8
; 5    :         printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);

        mov        eax, DWORD PTR _i$
        neg        eax
        mov        DWORD PTR -8+, eax
        mov        ecx, DWORD PTR -8+
        push        ecx
        mov        edx, DWORD PTR _i$
        neg        edx
        mov        DWORD PTR -12+, edx
        mov        eax, DWORD PTR -12+
        push        eax
        mov        ecx, DWORD PTR _i$
        mov        DWORD PTR -16+, ecx
        mov        edx, DWORD PTR -16+
        push        edx
        mov        eax, DWORD PTR _i$
        mov        DWORD PTR -20+, eax
        mov        ecx, DWORD PTR -20+
        push        ecx
        mov        edx, DWORD PTR _i$
        sub        edx, 1
        mov        DWORD PTR _i$, edx
        mov        eax, DWORD PTR _i$
        push        eax
        mov        ecx, DWORD PTR _i$
        add        ecx, 1
        mov        DWORD PTR _i$, ecx
        mov        edx, DWORD PTR _i$
        push        edx
        push        OFFSET FLAT:??_C@_0BD@PKOM@?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$AA@ ; `string'
        mov        eax, DWORD PTR _i$
        add        eax, 1
        mov        DWORD PTR _i$, eax
        mov        ecx, DWORD PTR _i$
        sub        ecx, 1
        mov        DWORD PTR _i$, ecx
        mov        edx, DWORD PTR _i$
        add        edx, 1
        mov        DWORD PTR _i$, edx
        mov        eax, DWORD PTR _i$
        sub        eax, 1
        mov        DWORD PTR _i$, eax
        call        _printf
        add        esp, 28                                        ; 0000001cH
所以编写程序的时候不要出现这种写法。
页: [1]
查看完整版本: 含有自增运算的输出