2008-09-26 13 views
10

Por ejemploUtilización de operadores de comparación fuera de los condicionales

int f(int a) { 
    ... 
    return a > 10; 
} 

es que considera aceptable (no es legal, que quiero decir es que `` buen código ''), o debe estar siempre en un condicional, como este

int f(int a) { 
    ... 
    if (a > 10) 
     return 1; 
    else 
     return 0; 
} 
+0

Dado que la función devuelve un int, sería mejor usar el operador terciario: return a> 10? 1: 0 –

+3

Creo que Jim significa "operador ternario" – ilitirit

Respuesta

31

¡Esto es absolutamente aceptable! De hecho, Joel mencionó esto en el último podcast de stackoverflow. Dijo que era lo único que tenía que mostrarle a casi todos los programadores que comienzan en Fog Creek.

+2

Cuando descubrí que no todos lo hacen de la primera manera, ¡me quedé pasmado! La primera forma es mucho más legible y concisa, mientras que la segunda es más difícil de entender porque un concepto simple y simple toma cuatro líneas en lugar de una. –

+0

Donde hice la licenciatura, si lo hiciste de la segunda forma, perdiste puntos en la tarea. Esto fue en la clase de introducción (pre mayor). – hazzen

+0

Especialmente si el tipo de devolución es bool. Me estremezco cuando veo algo como: if (a> 1) return true; else return false; – Ferruccio

4

No veo nada de malo en ello. En todo caso, es más conciso y creo que la mayoría de los desarrolladores con experiencia moderada lo preferirían.

2

La primera es mucho más preferible para mí, ya que es más concisa. (Y que evita múltiples retornos :)

0

Me suelen haré la primera sobre la segunda.

1

Creo que es perfectamente aceptable, siempre que se asegure de que haga un esfuerzo extra para mantener la legibilidad. Me gustaría asegurarme de que el nombre del método no sea ambiguo y use buenos nombres de variables.

La segunda alternativa que ya ha proporcionado Creo que es casi peor porque se trata de una declaración de sucursales y sentencias de retorno múltiples y estas cosas aumentan la complejidad del método, mientras que sí reducir su legibilidad.

37

Sería aceptable - si su tipo de retorno era bool.

+1

Buena marca de captura! –

2

Prefiero escribir bool f(int); y la primera forma como bool es el tipo boolean en C++. Si realmente necesito devolver un int, me gustaría escribir algo así como

int f(int) { 
    ... 
    const int res = (i>42) ? 1 : 0; 
    return res; 
} 

que nunca había entendido por qué la gente escribe

if (expr == true) 
    mybool = true ; 
else 
    mybool = false; 

en lugar de la llanura

mybool = expr; 

álgebra de Boole es una herramienta que cualquier desarrollador debería poder manejar instintivamente

Además, prefiero definir un nombre temporal ya que algunos depuradores no manejan muy bien los valores de retorno de función.

+1

Creo que quisiste devolver res, no 0. –

+0

El tipo bool no existe en C, pero en caso contrario, sí. –

+0

Está bien, existe en C99 ... ¡No importa! –

6

El primer caso es perfectamente bueno, mucho mejor que el segundo, en mi humilde opinión. Como cuestión de facilidad de lectura, yo personalmente haría

return (a > 10); 

pero eso es una liendre menor, y no que todo el mundo estaría de acuerdo en.

+0

No estoy de acuerdo. Hace que parezca que piensas que el retorno es una función que se llama. – Trent

+2

Solo si coloca espacios antes de sus paréntesis al llamar a funciones, lo cual yo no hago. –

13
return a > 10 ? 1 : 0; 

... tiene más sentido porque está devolviendo un int, no un bool.

1

No solo es esa sintaxis 100% aceptable, también debería sentirse libre de usar expresiones booleanas fuera de las declaraciones if, es decir, int x = i && (j || k); (o devolver valores como ese).

1

Creo que parte de esto tiene que ver con el estilo y la cultura del idioma. El primer ejemplo que ha escrito es el que se esperaría de un programador C con experiencia. Preferirían estrangularse a sí mismos antes que poner en un bloque innecesario de declaraciones.

creo que es perfectamente aceptable cuando el lenguaje lo permite y el uso es parte del paradigma de que el lenguaje

1

simplemente he intentado tres variantes diferentes con GCC:

int one(int x) { return (x > 42) ? 1 : 0; } 
int two(int x) { return x > 42; } 
int thr(int x) { if (x > 42) return 1; else return 0; } 

Tan pronto como se habilitar alguna optimización, el código generado para todos es el mismo. Entonces debería usar la variante que es más fácil de leer.

Cuestiones relacionadas