Maison > Questions et réponses > le corps du texte
1. Les paramètres de la fonction principe contiennent des expressions de pointeur. Dans quel ordre sont-ils calculés ? Les résultats de l'opération de code ne sont évidemment pas de gauche à droite.
#include <stdio.h>
int main() {
int a[5] = { 1,2,3,4,5 };
int *p = a;
printf("%d\n", *p);
printf("%d %d %d %d\n", *(++p)++,*p, *p++, *p);
getchar();
return 0;
}
给我你的怀抱2017-06-27 09:20:57
Modifier une variable plusieurs fois dans une seule instruction est un comportement indéfini et peut avoir des résultats différents selon les plates-formes. Cette question n'a aucun sens.
学习ing2017-06-27 09:20:57
printf{"%d",++i}
signifie deux opérations
Exécutez d'abord i=i+1, puis affichez i
Et i++ signifie
Première sortie, puis exécutez i=i+1
某草草2017-06-27 09:20:57
L'ordre de fonctionnement des paramètres de fonction a peu à voir avec la logique interne de la fonction. Il doit être calculé avant d'être poussé sur la pile (avant que la fonction ne soit exécutée)++p
,函数结束后,再计算p++
. Si vous souhaitez connaître la séquence spécifique, vous pouvez vous référer au code d'assemblage (la signification spécifique sera mise à jour demain, désolé)
.file "a.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d1
3 2 1 1
"
LC1:
.ascii "%d %d %d %drrreee"
.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 , %esp
.cfi_offset 6, -12
.cfi_offset 3, -16
call ___main
movl , 40(%esp)
movl , 44(%esp)
movl , 48(%esp)
movl , 52(%esp)
movl , 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 , 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 rrreee, %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
Digression :
2 et 3 qui apparaissent dans les résultats peuvent encore être expliqués.
4 C'est très étrange. Si je dois l'expliquer à contrecœur, le ++
en dehors des parenthèses de *(++p)++
signifie aussi p<. /code> Cela fonctionne,
*(++p)++
括号外面的++
也对p
起作用了,
但是形如p++
运算符,应该在语句结束后才自增的,所以这样解释明显不对。
我在Cygwin + gcc (GCC) 5.4.0
Mais l'opérateur sous la forme p++
doit être incrémenté après la fin de l'instruction, donc cette explication est évidemment fausse.
Cygwin + gcc (GCC) 5.4.0
. Les résultats d'exécution sont les suivants 4 n'apparaît pas. 🎜
rrreeeringa_lee2017-06-27 09:20:57
L'ordre dans lequel les paramètres de fonction sont placés sur la pile est certain, juste参数的求值顺序是未指定
的,
编译器只保证在printf
调用之前,所有参数的值是已知的
这方面的资料可以搜索序列点(Sequence Point)