Comprender el orden de salida de la función printf

Comprensión de las reglas de salida de la función printf

Contenido de fondo

Nota : El autor no ha estudiado el código fuente de printf, solo analiza el problema a partir del resultado de la llamada. Si hay alguna comprensión incorrecta, por favor corríjame.
Recientemente encontré un fenómeno interesante usando la función printf ().

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

Originalmente pensé que el resultado de salida era [0] [1] [2] [3], pero no esperaba que el resultado fuera: [3] [2] [1] [0]. y,

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

Resultó ser [3] [4] [1] [0].
Así que escribí algunos códigos de prueba

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]

Entender el contenido

Se puede ver en row1 ~ row3 que la
función printf () primero calcula el valor de cada expresión de derecha a izquierda , y luego formatea la salida de izquierda a derecha .

Se puede ver en row1, row5 y row7 que la
expresión j ++ devuelve el valor antes de incrementar. Puede ser que printf haya creado una variable temporal (suponga "a = j; j = j + 1; return a;"), donde se guarda la variable temporal a ;
++ j expresión devuelve la j incrementada, donde j se guarda;
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]

De la misma manera, se devuelve j en el paso 2 de la fila 4 y finalmente se emite 4.

Luego,

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++);

¿Cuál será el resultado de este código?

Supongo que te gusta

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