¿Por qué el valor de retorno de la función divertida es 8 en lugar de 7?
return-value comma (7)
Esta pregunta ya tiene una respuesta aquí:
- Operador de coma en c [duplicado] 3 respuestas
- ¿Qué hace el operador de coma? 8 respuestas
- ¿Qué significa i = (i, ++ i, 1) + 1; ¿hacer? 7 respuestas
Con referencia a los argumentos de retorno separados por comas en la función C [duplicado] ,
x=x+2,x+1;
será evaluado como
x=x+2;
Sin embargo, en el caso del siguiente código
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
No debe alinearse [A], evaluarse como
x=x+2;
dando
x = 7
Al escribir
return (x=x+2,x+1)
, la primera expresión se evalúa primero, por lo que
x=x+2
se evalúa, lo que hace que x sea igual a 7 como efecto secundario.
Luego, la segunda expresión se evalúa y se devuelve, por lo tanto, la función devuelve x + 1, por lo tanto, devuelve 8.
Si hubiera escrito
return (x+2,x+1);
, el resultado habría sido 6 porque la primera expresión
x+2
no tiene ningún efecto secundario.
Ambas partes en el
return
se evalúan respectivamente y se
return
el resultado de la última instrucción:
Al principio tenemos:
x = x + 2 // 7
Ahora
x
se actualiza a
7
antes de la segunda evaluación que da:
x + 1 // 7 + 1 = 8
y finalmente regreso
8
.
Para una mejor comprensión, considere el caso de la variable intermedia de la siguiente manera:
return (y = x + 2, y + 1);
Como indicaron otros usuarios, el flujo de comandos va de izquierda a derecha y, en el caso de
return
, devolverá el valor en el operador más a la derecha.
Lo que está escrito antes de este operador y separado por comas no es diferente de las expresiones escritas en línea.
Ejemplo:
return (x = x + 2, x = x - 5, x + 1);
El siguiente código produce el mismo resultado:
x = x + 2;
x = x - 5;
return x + 1;
Para
x = 0
, esto devolvería
-2
.
Observe que, para ambos códigos, si cambiamos
x = x - 5
a
x - 5
, es decir, restamos
5
de
x
pero no guardamos su resultado en ninguna parte, el valor de retorno de
x
cambiará a
3
y, por lo tanto, confirmará el equivalencia.
El control de calidad que usted convenientemente vinculó a los estados
El operador de coma evalúa una serie de expresiones. El valor del grupo de comas es el valor del último elemento de la lista.
entonces el valor de
x+2,x+1;
es
x+1
y no hay efectos secundarios.
Código de muestra:
#include<stdio.h>
int main(int argc, char * argv){
int x;
x = 0;
x = (x+2, x+1);
printf("%d/n", x);
return 0;
}
da como resultado
1
cuando se ejecuta.
Sin embargo, cuando lo haces
return (x=x+2, x+1)
sí tiene un efecto secundario
:
x
se incrementa en dos primero, luego
x
se incrementa en 1 y se devuelve el resultado.
El enunciado
return (x = x + 2, x + 1);
es equivalente a:
x = x + 2; // x == 7
return x + 1; // returns 8
El operador de coma introduce un punto de secuencia en su código. Las declaraciones se evalúan en este orden:
-
x = x + 2
, en cuyo punto lax
local enfun
es 7. -
x + 1
, que se evalúa como 8 y se devuelve.
Para aclarar, aquí hay una versión entre paréntesis que muestra la precedencia del operador:
return (x=x+2),x+1;
La expresión de la izquierda se evalúa y su valor se descarta. El valor de la expresión de la mano derecha es lo que se devuelve.
Eso es una cuestión de precedencia del operador.
x=x+2,x+1
se evalúa como
(x=x+2), (x+1)
y no como
x=(x+2,x+1)