c return-value comma

¿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í:

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:

  1. x = x + 2 , en cuyo punto la x local en fun es 7.

  2. 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)