Apabila fungsi printf bahasa C/C++ mengeluarkan nilai tatasusunan yang ditunjuk oleh penuding, mengapakah nilai penuding berubah seperti ini?
大家讲道理
大家讲道理 2017-06-27 09:18:57
0
4
1522

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(4)
给我你的怀抱

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.

学习ing

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

某草草

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 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
ringa_lee

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan