recherche

Maison  >  Questions et réponses  >  le corps du texte

Lorsque la fonction printf du langage C/C++ génère la valeur du tableau pointé par le pointeur, pourquoi la valeur du pointeur change-t-elle comme ceci ?

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;
}

大家讲道理大家讲道理2732 Il y a quelques jours1518

répondre à tous(4)je répondrai

  • 给我你的怀抱

    给我你的怀抱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.

    répondre
    0
  • 学习ing

    学习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

    répondre
    0
  • 某草草

    某草草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 "%d
    1
    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.0Mais l'opérateur sous la forme p++ doit être incrémenté après la fin de l'instruction, donc cette explication est évidemment fausse.

    Je suis dans l'environnement Cygwin + gcc (GCC) 5.4.0. Les résultats d'exécution sont les suivants 4 n'apparaît pas. 🎜 rrreee

    répondre
    0
  • ringa_lee

    ringa_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)

    répondre
    0
  • Annulerrépondre