搜尋

首頁  >  問答  >  主體

C/C++語言printf函數輸出指標指向的陣列的值時,指標的值為什麼會這樣變化?

1.請問prinf函數的參數中含有指標表達式,是依照什麼順序運算的,程式碼運算結果中顯然不是從左到右進行的。

#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 天前1517

全部回覆(4)我來回復

  • 给我你的怀抱

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

    在一條語句裡多次改變一個變數屬於未定義行為,在不同平台可能有不同結果。這個問題沒有意義。

    回覆
    0
  • 学习ing

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

    printf{"%d",++i} 表示兩個運算

    先執行i=i+1,再輸出i

    而 i++ 表示的是

    先輸出後,再執行 i=i+1

    回覆
    0
  • 某草草

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

    函數參數的運算順序,跟函數的內部邏輯關係不大,應該是入棧前(函數執行前)先計算++p,函數結束後,再計算p++。如果想知道具體的順序,可以參考彙編程式碼(具體意義等我明天更新,抱歉)

        .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

    題外話:
    結果中出現的2和3還可以說的通。
    4很奇怪,非要勉強地解釋的話,*(++p)++括號外面的++也對p起作用了,
    但是形如p++運算符,應該在起作用了,
    但是形如p++運算符,應該在語句結束後才自增的,所以這樣解釋明顯不對。

    我在🎜Cygwin + gcc (GCC) 5.4.0🎜環境,運行的結果如下,沒有出現4,請問題主用了什麼環境? 🎜 rrreee

    回覆
    0
  • ringa_lee

    ringa_lee2017-06-27 09:20:57

    函數參數壓棧的順序是一定的,只是參數的求值順序是未指定的,
    編譯器只保證在printf呼叫之前,所有參數的值是已知的
    這方面的資料可以搜尋序列點(Sequence Point)

    回覆
    0
  • 取消回覆