cari

Rumah  >  Soal Jawab  >  teks badan

Apabila fungsi printf bahasa C/C++ mengeluarkan nilai tatasusunan yang ditunjuk oleh penuding, mengapakah nilai penuding berubah seperti ini?

1. Parameter fungsi prinf mengandungi ungkapan penunjuk dalam susunan yang manakah hasil operasi kod itu jelas bukan dari kiri ke kanan.

#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 hari yang lalu1514

membalas semua(4)saya akan balas

  • 给我你的怀抱

    给我你的怀抱2017-06-27 09:20:57

    Menukar pembolehubah berbilang kali dalam satu pernyataan adalah tingkah laku yang tidak ditentukan dan mungkin mempunyai hasil yang berbeza pada platform yang berbeza. Soalan ini tidak masuk akal.

    balas
    0
  • 学习ing

    学习ing2017-06-27 09:20:57

    printf{"%d",++i} bermaksud dua operasi

    Mula-mula laksanakan i=i+1, kemudian keluarkan i

    Dan i++ bermaksud

    Output pertama, kemudian laksanakan i=i+1

    balas
    0
  • 某草草

    某草草2017-06-27 09:20:57

    Susunan operasi parameter fungsi mempunyai sedikit kaitan dengan logik dalaman fungsi Ia perlu dikira sebelum ditolak ke tindanan (sebelum fungsi dilaksanakan)++p,函数结束后,再计算p++. Jika anda ingin mengetahui urutan tertentu, anda boleh merujuk kepada kod pemasangan (maksud khusus akan dikemas kini esok, maaf)

        .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 dan 3 yang muncul dalam keputusan masih boleh dijelaskan.
    4 Sangat pelik Jika saya terpaksa menerangkannya dengan berat hati, ++ di luar kurungan *(++p)++ juga bermaksud p< /code> Ia berfungsi, *(++p)++括号外面的++也对p起作用了,
    但是形如p++运算符,应该在语句结束后才自增的,所以这样解释明显不对。
    我在Cygwin + gcc (GCC) 5.4.0Tetapi operator dalam bentuk p++ harus ditambah selepas penyataan tamat, jadi penjelasan ini jelas salah.

    Saya berada dalam persekitaran Cygwin + gcc (GCC) 5.4.0 Keputusan yang dijalankan adalah seperti berikut. 🎜 rrreee

    balas
    0
  • ringa_lee

    ringa_lee2017-06-27 09:20:57

    Tertib di mana parameter fungsi ditolak ke tindanan adalah pasti, cuma参数的求值顺序是未指定的,
    编译器只保证在printf调用之前,所有参数的值是已知的
    这方面的资料可以搜索序列点(Sequence Point)

    balas
    0
  • Batalbalas