En muchos idiomas, las asignaciones son legales en condiciones. Nunca entendí la razón detrás de esto. Por qué escribirías:
if (var1 = var2) {
...
}
en vez de:
var1 = var2;
if (var1) {
...
}
En muchos idiomas, las asignaciones son legales en condiciones. Nunca entendí la razón detrás de esto. Por qué escribirías:
if (var1 = var2) {
...
}
en vez de:
var1 = var2;
if (var1) {
...
}
Respuestas:
Es más útil para bucles que declaraciones if.
Que de otro modo tendría que escribirse
fuente
Lo encuentro más útil en cadenas de acciones que a menudo implican detección de errores, etc.
La alternativa (no usar la asignación en la condición) es:
Con una verificación de errores prolongada, la alternativa puede salir del lado derecho de la página, mientras que la versión de asignación en condicional no lo hace.
Las comprobaciones de errores podrían ser también 'acciones' -
first_action()
,second_action()
,third_action()
- por supuesto, en lugar de cheques solo. Es decir, se podrían comprobar pasos en el proceso que está gestionando la función. (La mayoría de las veces en el código con el que trabajo, las funciones están en la línea de las verificaciones de condiciones previas, o las asignaciones de memoria necesarias para que la función funcione, o en líneas similares).fuente
Es más útil si está llamando a una función:
Claro, puede poner n = foo (); en una declaración separada, entonces si (n), pero creo que lo anterior es un idioma bastante legible.
fuente
Puede ser útil si está llamando a una función que devuelve datos sobre los que trabajar o una marca para indicar un error (o que ya ha terminado).
Algo como:
Personalmente es un idioma que no me gusta mucho, pero a veces la alternativa es más fea.
fuente
GCC puede ayudarlo a detectar (con -Wall) si involuntariamente intenta usar una asignación como valor de verdad, en caso de que le recomiende escribir
Es decir, use paréntesis extra para indicar que esto es realmente lo que desea.
fuente
El idioma es más útil cuando estás escribiendo un
while
bucle en lugar de unaif
declaración. Para unaif
declaración, puede dividirlo como lo describe. Pero sin esta construcción, tendría que repetirse:o use una estructura de bucle y medio:
Por lo general, preferiría la forma de bucle y medio.
fuente
while
bucle, prefiera usar:do { c = getchar(); ... } while (c != EOF);
for
se pueden usar bucles en su lugar:for (char c = getchar(); c != EOF; c= getchar()) { /* do something with c */ }
- este es el más conciso, yfor
siempre me dice 'bucle', estilísticamente. El pequeño inconveniente es que debe especificar la función que regresac
dos veces.La respuesta corta es que los lenguajes de programación orientados a expresiones permiten un código más sucinto. No te obligan a separar los comandos de las consultas .
fuente
En PHP, por ejemplo, es útil para recorrer los resultados de la base de datos SQL:
Esto se ve mucho mejor que:
fuente
La otra ventaja viene durante el uso de gdb. En el siguiente código no se conoce el código de error si fuéramos a un solo paso.
Más bien
Ahora, durante un solo paso, podemos saber cuál fue el código de error de retorno del checkstatus ().
fuente
Lo encuentro muy útil con funciones que devuelven opcionales (
boost::optional
ostd::optional
en C ++ 17):Esto reduce el alcance de mi variable, hace que el código sea más compacto y no dificulta la legibilidad (lo encuentro).
Lo mismo con los punteros:
fuente
La razón es:
Mejora del rendimiento (a veces)
Menos código (siempre)
Tome un ejemplo: hay un método
someMethod()
y en unaif
condición desea verificar si el valor de retorno del método esnull
. Si no es así, volverá a utilizar el valor de retorno.Obstaculizará el rendimiento ya que está llamando al mismo método dos veces. En su lugar use:
fuente