sintaxis - ¿Comportamiento diferente del operador de coma en C++ con retorno?
sintaxis de c++ (4)
De acuerdo con la
precedencia
del
operador
, el
operador de coma
tiene una precedencia menor que el
operator=
, entonces
x = 2,3;
es equivalente a
(x = 2),3;
.
(La precedencia del operador determina cómo el operador estará vinculado a sus argumentos, más estricto o más suelto que otros operadores de acuerdo con sus precedentes).
Tenga en cuenta que la expresión de coma es
(x = 2),3
aquí, no
2,3
.
x = 2
se evalúa al principio (y se completan sus efectos secundarios), luego se descarta el resultado, luego se evalúa
3
(de hecho, no hace nada).
Es por eso que el valor de
x
es
2
.
Tenga en cuenta que
3
es el resultado de la expresión de coma completa (es decir,
x = 2,3
), no se utilizará para asignar a
x
.
(Cámbielo a
x = (2,3);
x
se le asignará
3
).
Para el
return 2,3;
, la expresión de coma es
2,3
,
2
se evalúa y luego se descarta su resultado, y luego
3
se evalúa y se devuelve como el resultado de la expresión de coma completa, que luego se devuelve mediante la
declaración de retorno
.
Información adicional sobre Expressions y Statements
Una expresión es una secuencia de operadores y sus operandos, que especifica un cálculo.
x = 2,3;
es una
declaración de expresión
,
x = 2,3
es la expresión aquí.
Una expresión seguida de un punto y coma es una declaración.
Sintaxis:
attr(optional) expression(optional) ; (1)
attr(optional) expression(optional) ; (1)
return 2,3;
es la
declaración de salto
(
declaración de
retorno
),
2,3
es la expresión aquí.
Sintaxis:
attr(optional) return expression(optional) ; (1)
attr(optional) return expression(optional) ; (1)
Esto (tenga en cuenta el operador de coma ):
#include <iostream>
int main() {
int x;
x = 2, 3;
std::cout << x << "/n";
return 0;
}
salidas 2 .
Sin embargo, si usa
return
con el operador de coma, esto:
#include <iostream>
int f() { return 2, 3; }
int main() {
int x;
x = f();
std::cout << x << "/n";
return 0;
}
salidas 3 .
¿Por qué el operador de coma se comporta de manera diferente con
return
?
El operador de coma (también conocido como
separación de expresiones
) se evalúa de izquierda a derecha.
Entonces
return 2,3;
es equivalente a
return 3;
.
La evaluación de
x = 2,3;
es
(x = 2), 3;
debido a la
precedencia del operador
.
La evaluación todavía es de izquierda a derecha, y
toda la
expresión tiene el valor 3 con el efecto secundario de
x
asumiendo el valor de 2.
Esta declaración:
x = 2,3;
está compuesto por dos expresiones :
> x = 2
> 3
Dado
que la precedencia del operador
,
=
tiene más precedencia que la coma, entonces
x = 2
se evalúa y
después de
3
.
Entonces
x
será igual a
2
.
En
return
cambio:
int f(){ return 2,3; }
La sintaxis del lenguaje es:
return <expression>
Nota
return
no es parte de la expresión.
Entonces, en ese caso, las dos expresiones que se evaluarán serán:
> 2
> 3
Pero solo se devolverá el segundo (
3
).
Intente aplicar el enfoque simplista simplemente resaltando la precedencia con paréntesis:
( x = 2 ), 3;
return ( 2, 3 );
Ahora podemos ver el operador binario "," trabajando de la misma manera en ambos, de izquierda a derecha.