84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
1. prinf 関数のパラメーターにはポインター式が含まれていますが、それらはどのような順序で計算されますか? コード操作の結果は明らかに左から右ではありません。
光阴似箭催人老,日月如移越少年。
在一条语句里多次改变一个变量属于未定义行为,在不同平台可能有不同结果。这个问题没有意义。
printf{"%d",++i} 表示两个操作
printf{"%d",++i}
先执行i=i+1,再输出i
而 i++ 表示的是
先输出后,再执行 i=i+1
函数参数的运算顺序,跟函数的内部逻辑关系不大,应该是入栈前(函数执行前)先计算++p,函数结束后,再计算p++。如果想知道具体的顺序,可以参照汇编代码(具体含义等我明天更新,抱歉)
++p
p++
.file "a.cpp" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "%d\12\0" LC1: .ascii "%d %d %d %d\12\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB10: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 pushl %esi pushl %ebx andl $-16, %esp subl $64, %esp .cfi_offset 6, -12 .cfi_offset 3, -16 call ___main movl $1, 40(%esp) movl $2, 44(%esp) movl $3, 48(%esp) movl $4, 52(%esp) movl $5, 56(%esp) leal 40(%esp), %eax movl %eax, 60(%esp) movl 60(%esp), %eax movl (%eax), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl 60(%esp), %eax movl (%eax), %ebx movl 60(%esp), %eax leal 4(%eax), %edx movl %edx, 60(%esp) movl (%eax), %ecx movl 60(%esp), %eax movl (%eax), %edx addl $4, 60(%esp) movl 60(%esp), %eax leal 4(%eax), %esi movl %esi, 60(%esp) movl (%eax), %eax movl %ebx, 16(%esp) movl %ecx, 12(%esp) movl %edx, 8(%esp) movl %eax, 4(%esp) movl $LC1, (%esp) call _printf call ___getreent movl 4(%eax), %eax movl %eax, (%esp) call _getc movl $0, %eax leal -8(%ebp), %esp popl %ebx .cfi_restore 3 popl %esi .cfi_restore 6 popl %ebp .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE10: .ident "GCC: (GNU) 5.4.0" .def _printf; .scl 2; .type 32; .endef .def ___getreent; .scl 2; .type 32; .endef .def _getc; .scl 2; .type 32; .endef
题外话:结果中出现的2和3还可以说的通。4很奇怪,非要勉强地解释的话,*(++p)++括号外面的++也对p起作用了,但是形如p++运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在Cygwin + gcc (GCC) 5.4.0环境,运行的结果如下,没有出现4,请问题主用了什么环境?
*(++p)++
++
p
Cygwin + gcc (GCC) 5.4.0
1 3 2 1 1
函数参数压栈的顺序是一定的,只是参数的求值顺序是未指定的,编译器只保证在printf调用之前,所有参数的值是已知的这方面的资料可以搜索序列点(Sequence Point)
参数的求值顺序是未指定
printf
序列点(Sequence Point)
在一条语句里多次改变一个变量属于未定义行为,在不同平台可能有不同结果。这个问题没有意义。
printf{"%d",++i}
表示两个操作先执行i=i+1,再输出i
而 i++ 表示的是
先输出后,再执行 i=i+1
函数参数的运算顺序,跟函数的内部逻辑关系不大,应该是入栈前(函数执行前)先计算
++p
,函数结束后,再计算p++
。如果想知道具体的顺序,可以参照汇编代码(具体含义等我明天更新,抱歉)题外话:
结果中出现的2和3还可以说的通。
4很奇怪,非要勉强地解释的话,
*(++p)++
括号外面的++
也对p
起作用了,但是形如
p++
运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在
Cygwin + gcc (GCC) 5.4.0
环境,运行的结果如下,没有出现4,请问题主用了什么环境?函数参数压栈的顺序是一定的,只是
参数的求值顺序是未指定
的,编译器只保证在
printf
调用之前,所有参数的值是已知的这方面的资料可以搜索
序列点(Sequence Point)