Paréntesis que rodea los valores de retorno

Muy a menudo en el código ANSI C puedo ver paréntesis alrededor de un único valor de retorno.

Me gusta esto:-

int foo(int x) { if (x) return (-1); else return (0); } 

¿Por qué use () alrededor del valor de retorno en esos casos? ¿Algunas ideas? No puedo ver ninguna razón para eso.

Realmente no hay una razón … es solo una vieja convención.

Para ahorrar espacio, los progtwigdores suelen hacer los cálculos finales en la línea de retorno en lugar de hacerlo en su propia línea y los parientes se aseguran de que están en su mayoría allí para que sea más fácil ver que se devuelve una sola statement, como esta:

 return (x+i*2); 

en lugar de

 int y = x+i*2; return y; 

El paréntesis se convirtió en un hábito y se estancó.

Un motivo práctico, pero poco probable, es que si coloca paréntesis alrededor del valor, puede definir el retorno como una macro, y luego insertar algún código de registro para ver todas sus devoluciones.

Mi estilo personal es usar paréntesis si hay una expresión compleja; p.ej,

 return (a + b); 

pero no usarlos si la expresión es un término simple

 return a; 

No puedo decir por qué lo hago de esa manera; algo que recogí hace mucho tiempo.

Por cierto, creo que parece una llamada a función, así:

 return(a); // ugh 

es increíblemente feo y simplemente está mal.

Hay unas pocas razones:

  1. if / while / for / etc. son todas palabras clave de control que deben tener parens. Por lo tanto, a menudo parece natural que siempre los devuelvan también.

  2. sizeof es la única palabra clave que puede tenerlos o no, excepto que en algunos casos debe usar parens. Entonces es más fácil adoptar el hábito de usar siempre parens. para sizeof, lo que implica una lógica de: si puedes, siempre lo haces.

  3. case / goto son las únicas palabras clave donde nunca usas parens. … y la gente tiende a pensar en ellos como casos especiales (y les gusta a ambos destacar de otras palabras clave de control, especialmente goto).

Al devolver -1 como en su ejemplo, creo que es más legible con el paréntesis porque el menos es más visible:

 return 1 

o

 return -1 

o

 return (-1) 

En la especificación C original, se requerían paréntesis alrededor del valor de retorno. Si bien los comstackdores modernos de C y el estándar ANSI C no los requieren, la presencia de paréntesis no afecta el valor de retorno, y los progtwigdores algunas veces todavía los incluyen por costumbre, falta de familiaridad con los estándares, por coherencia con una convención estilística que los requiere. o posiblemente por compatibilidad con versiones anteriores.

Tal vez es una costumbre, después de todo, la gente que nos trajo Unix y C vino del proyecto Multics. Multics se escribió en PL / I, y en PL / I los paréntesis son obligatorios.

He trabajado con al menos un progtwigdor que pensó que el retorno era un tipo especial de llamada de función, y me sorprendió cuando vio que mi código cumplía sin los paréntesis.

Como suele ser el caso cuando uso paréntesis, creo que es solo para legibilidad (por ej., Ruby admite llamadas a métodos sin paréntesis que encierran los argumentos, pero los libros y artículos recientes aconsejan lo contrario).

Quizás esto se deba a que, con paréntesis, se parece más a una llamada a función, es decir, se parece más al rest del código.

O simplemente es algo que todos hacen, solo porque todos los demás lo hacen 🙂

Los paréntesis en una statement de retorno indican al comstackdor que tiene la intención de que se devuelva este valor en la stack en lugar de en la memoria.

En los viejos tiempos esto se aplicaba rigurosamente (normalmente), pero hoy en día la mayoría de los comstackdores solo lo toman como una pista.

Esto es algo que hago con frecuencia, ya que un error podría corromper todo lo que se devuelve a través de una referencia de memoria, pero normalmente no afectará a una variable que se devuelve en la stack.

El uso de la stack para variables transitorias también reduce el uso de la memoria y generalmente hace que la función llame / regrese más rápido porque para eso está diseñada la stack, datos / variables transitorias.

El uso de paréntesis en una statement de retorno muestra una comprensión deficiente de la syntax C/C++ . Es tan simple como eso. Pero no es tan malo como poner todo en llaves:

 int foo(int x) { if (x) { return (-1); } else { return (0); } } 

Muchos progtwigdores hacen esto. Si uno de ustedes lee esto, tal vez le gustaría explicar.