2010-05-06 15 views
22

Esto es demasiado básico, creo, pero ¿cómo funcionan ambos?¿Se devuelve un operador o una función?

return true; // 1 

y

return (true); // 2 

similares: sizeof, exit

Mi suposición:

Si regreso era una función, 1 habría errónea.

Así, vuelva debe ser un unary operator que también se puede tomar en soportes ... más o menos como unary minus: -5 y -(5), ambos son bien.

¿Eso es lo que es, un operador unario?

+25

Si 'return' fuera una función, ¿cómo regresaría? – Nefrubyr

+4

@Nefrubyr: las funciones void no necesitan declaraciones de devolución explícitas. – Lazer

+1

sizeof es un comando en tiempo de compilación. Como corolario Unas gotchas bastante famosas es que sizeof (f()) en realidad no llama a f. – fulmicoton

Respuesta

29

return es una palabra clave quemanipula el flujo de control. En eso es similar a if, for etc. Se puede usar con o sin una expresión (return; devuelve de una función void). Por supuesto, como con todas las expresiones, se permiten paréntesis adicionales. (Así return (42); es similar a int i = (4*10+2);, en ambos casos, los paréntesis son redundantes, pero permitido.)

sizeof es una palabra claveque es un operador , similar a new, delete, +, ->, :: , etc.

std::exit() es un identificador que denota un functio n de la biblioteca estándar C (que nunca regresa a la persona que llama).

+0

Pensé que 'sizeof()' era una macro? ¿O al menos solo calculado en tiempo de compilación? – dlamotte

+0

nevermind, 'sizeof()' era una palabra clave en tiempo de compilación en C89, pero ahora es una cosa en tiempo de ejecución (debido a los VLA, ¡asqueroso!) – dlamotte

+0

@xyld: Todavía es una __palabra clave__ y sigue siendo un __operador__. ':)' – sbi

27

return es solo una construcción de flujo de lenguaje/control. Ciertamente no es una función, ya que es sintácticamente irreductible, y tampoco es realmente un operador, ya que no tiene valor de retorno.

+0

@Will Vousden: ¿qué es una "construcción de flujo de control", aparte de lo que el nombre me dice? – Lazer

+2

Buen punto. Si 'return' tuviera un valor' return', sería un poco demasiado recursivo;) – ereOn

+3

@eSKay: Una construcción de flujo de control es algo que altera el flujo de control del programa. Consulte aquí: http://en.wikipedia.org/wiki/Control_flow 'return' también podría considerarse una construcción de lenguaje, ya que en realidad es parte de la sintaxis del lenguaje. Mira aquí: http: //en.wikipedia.org/wiki/Language_construct –

17

return no es un operador y no es una función. return es una palabra clave que forma un declaración de devolución, que pertenece a la categoría de declaraciones de salto. En ese sentido, no tiene absolutamente ninguna similitud con sizeof o exit.

El requisito para poner () todo el argumento de return existido en antiguas versiones pre-estándar de C (CRM C, por ejemplo), pero fue eliminado rápidamente, a pesar de que el hábito peculiar para envolver el argumento de return en superflua () se puede ver de vez en cuando, incluso hoy en día.

+0

@AndreyT: ¿los operadores 'sizeof' y' exit'? – Lazer

+2

@eSKay: 'sizeof' es un operador. 'exit' es una función de biblioteca stanadard. – AnT

+0

bien ... entonces, en caso de una condición de error en mi programa donde tengo que abortar, ¿debería usar 'exit (0)' o 'return'? ¿Hay alguna situación en la que se prefiera 'exit (0)'? – Lazer

7

retorno es una palabra clave de control de flujo, al igual que goto, break, continue, if, else ... No pensar en él como un operador, ya que no altera el valor detrás de él. Los () son solo para evaluar expresiones y el resultado de la expresión evaluada se transmitirá a la función de llamada (cómo depende la implementación del compilador om).

Tampoco es una función, solo piénselo: ¿cómo regresaría?

4

"return" no es una rutina ni un operador.

Se traduce en instrucciones de ensamblador bien conocidas. Por ejemplo, en la arquitectura x86, se traduce como "ret", y en el PowerPC, la arquitectura se traduce en "blr".

Para el valor que devuelve, el compilador mueve ese valor al registro correspondiente antes de emitir la instrucción de devolución. En la arquitectura x86, esto es típicamente EAX y EDX si es necesario; los registros cambiarán ligeramente para x86-64. En PPC, si la memoria sirve, es r1; otros pueden corregirme si me equivoco con ese detalle.

Espero que esto ayude.

+0

Como recuerdo, r1 es el puntero de la pila y r3 el valor de retorno. Vea la figura A-1 aquí: http://wall.riscom.net/books/proc/ppc/cwg/a_abi.html – Nefrubyr

2
'true' is an Expression, 
'(true)' is an Expression. 

retorno siempre puede ser seguido por una expresión, pero para el regreso a tipo de comprobación, la expresión debe tener el mismo tipo del tipo de retorno de la función.

hense se puede generalizar diciendo

return Expression. 

(En una función con un tipo void retorno, return no puede ir seguida de una expresión, un desnudo return simplemente sale de la función.)

0

"El requisito de poner() alrededor del argumento de retorno existía en antiguas versiones pre-estándar de C (CRM C, por ejemplo), pero fue eliminado rápidamente, a pesar de que el peculiar hábito de envolver el argumento de retorno en superfluo() puede ser visto de vez en cuando incluso hoy ".

Sí, ya sabes que estás mirando un código viejo o alguien piensa que volver es una función cuando los ves usando parásitos todo el tiempo. Mi instructor universitario hizo eso y me molestó todo el tiempo. Oh, bueno, al menos fue consecuente.

Cuestiones relacionadas