Compreender a ordem de saída da função printf

Compreensão das regras de saída da função printf

Conteúdo de fundo

Nota : O autor não estudou o código fonte do printf, apenas analisa o problema a partir do resultado da chamada.Se houver algum entendimento impróprio corrija-me.
Recentemente, encontrei um fenômeno interessante usando a função printf ().

int j=0;
printf("[%x][%x][%x][%x]\n",j++,j++,j++,j++); //Result: [3] [2] [1] [0]

Originalmente, pensei que o resultado da saída fosse [0] [1] [2] [3], mas não esperava que o resultado fosse: [3] [2] [1] [0]. e,

printf("[%x] [%x] [%x] [%x]\n", j++, j=j+1, j++, j++); //[3] [4] [1] [0]

Acabou sendo [3] [4] [1] [0].
Então, escrevi alguns códigos de teste,

int \
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row1*/j++, j++,   j++, j++); //[3] [2] [1] [0]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row2*/j,   j++,   j++, j++); //[3] [2] [1] [0]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row3*/j++, j++,   j,   j++); //[2] [1] [3] [0]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row4*/j++, j=j+1, j++, j++); //[3] [4] [1] [0]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row5*/j++, ++j,   j++, j++); //[3] [4] [1] [0]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row6*/j++, ++j,   j++, ++j); //[3] [4] [1] [4]
j=0; printf("[%x] [%x] [%x] [%x]\n", /*row7*/++j, ++j,   ++j, ++j); //[4] [4] [4] [4]

Entenda o conteúdo

Pode-se ver nas linhas 1 ~ 3 que a
função printf () primeiro calcula o valor de cada expressão da direita para a esquerda e, em seguida, formata a saída da esquerda para a direita .

Pode ser visto na linha 1, linha 5 e linha 7 que a
expressão j ++ retorna o valor antes de incrementar. Pode ser que printf tenha criado uma variável temporária ( suponha que "a = j; j = j + 1; retornar a;"), onde a variável temporária a é salva ;
++ j expressão retorna o j incrementado, onde j é salvo;
row1:
=> j++, j++, j++, j++
=> 从右至左计算,返回临时变量tmp
=> step3(tmp3=3, j=4), step2(tmp2=2, j=3), step1(tmp1=1, j=2), step0(tmp0=0,j=1);
=> 从左至右输出(tmp3, tmp2, tmp1, tmp0)。
=> [3] [2] [1] [0]

row5:
=> j++, ++j, j++, j++
=> 从右至左计算,j++返回临时变量tmp,++j返回j
=> step3(tmp3=3, j=4), step2(j=3), step1(tmp1=1, j=2), step0(tmp0=0, j=1);
=> 从左至右输出(tmp3, j, tmp1, tmp0)。
=> [3] [4] [1] [0]

row7:
=> ++j, ++j, ++j, ++j
=> 从右至左计算,++j返回j
=> step3(j=4), step2(j=3), step1(j=2), step0(j=1);
=> 从左至右输出(j, j, j, j)。
=> [4] [4] [4] [4]

Da mesma forma, j é retornado na etapa 2 da linha 4 e, finalmente, 4 é a saída.

Então,

int arr[5] = {
    
    0, 1, 2, 3, 4};
int *p = arr;
j=0; printf("[%x][%x][%x][%x]\n", p[j++], p[j++], p[j++], p[j++]);
j=0; printf("[%x][%x][%x][%x]\n", p[++j], p[++j], p[++j], p[++j]);
j=0; printf("[%x][%x][%x][%x]\n", p[j++], p[++j], p[j++], p[++j]);
p = arr;j=0; printf("[%x][%x][%x][%x]\n", *p++, *p++, *p++, *p++);
p = arr;j=0; printf("[%x][%x][%x][%x]\n", *++p, *++p, *++p, *++p);
p = arr;j=0; printf("[%x][%x][%x][%x]\n", *++p, *p++, *++p, *p++);

Qual será o resultado desse código?

Acho que você gosta

Origin blog.csdn.net/jimaofu0494/article/details/97271909
Recomendado
Clasificación