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?