tipos - ¿No se necesita un punto y coma('';'') después de una declaración de función en C++?
tipos de variables en c++ (12)
Hace poco hice una prueba de programación intermedia, y una de las preguntas que obtuve mal fue la siguiente:
No se necesita un punto y coma ('';'') después de una declaración de función.
Verdadero o falso.
Elegí "falso" (y corríjame si me equivoco porque siento que me estoy volviendo loco), una declaración de función es lo que escribe antes de la definición (en la parte superior del código) para que el compilador conozca la función llame antes incluso de llamarlo, y una definición de función es lo que constituye la función como un todo.
Es decir,
Declaración:
int func();
Definición:
int func() {
return 1;
}
¿No debería ser falsa la respuesta a esto?
No se necesita un punto y coma ('';'') después de una declaración de función.
Verdadero o falso.
Cierto No se necesita un punto y coma después de cualquier declaración. Ni después de ninguna definición. Ni después de cualquier declaración.
Muchos tipos de declaración tienen que terminar con un punto y coma, como especifica la sintaxis en la sección 7 [dcl.dcl]. Pero nunca hay necesidad de escribir un segundo después de eso.
Además de la cosa "una definición es también una declaración", lo siguiente es legal C ++:
int f(), g();
Esto declara dos funciones,
f
y
g
, ambas sin argumentos y con un tipo de retorno de
int
, pero la definición de
f
no está seguida (inmediatamente) por un punto y coma.
Asimismo, esto es legal:
int f(), i = 42;
Pero, de hecho, no está permitido omitir el punto y coma por completo en estos casos, por lo que sería algo sorprendente si se tomara como ejemplo de una declaración sin un punto y coma siguiente. De hecho, lo siguiente es ilegal:
void *p, f() {}
Aparte de una (mera) declaración de función, una
definición de
función no puede combinarse con ninguna otra declaración o definición para el mismo
especificador de tipo
.
(Si esto fuera legal, definiría un
void *p
y un
void f() {}
.)
En cualquier caso, esto parece ser un tipo de pregunta "gotcha" que no debería estar en una prueba de programación intermedia.
(Oh, por cierto, por favor, no escriba código como
int f(), i = 42;
)
Aunque estoy de acuerdo con casi todas las otras respuestas, afirmando que la pregunta está redactada de manera muy ambigua y que su respuesta es técnicamente correcta, permítame darle una perspectiva diferente:
Así es como siempre los he llamado:
void func(); // The function prototype
...
void func()
{
// The function definition
}
Supongo que la pregunta se hizo con esta terminología en mente.
Definición y declaración son ambos el mismo concepto en mis ojos. "Defino x = y" == "Declaro x = y".
Pero, por supuesto, hay una gran diferencia entre el prototipo de función (en la parte superior) y la definición real de la función.
Cuando las funciones se definen antes de main () :
- No necesita punto y coma porque la función ya está definida.
Cuando las funciones se definen después de main () :
- Necesita un punto y coma porque, como usted está creando un prototipo de esa función y le dice al compilador que la función se cierra.
El punto y coma (;) se utiliza para indicar al compilador que después de este punto y coma (;) se inicia una nueva instrucción.
Así que creo que el punto y coma (;) se requiere solo durante una declaración de función. Así que de acuerdo a mí, la respuesta será verdadera.
Es una pena que la pregunta que tomaste no diga "directamente después". Podríamos, por ejemplo, escribir esto:
int func() /* My function */ ;
O podría escribir:
int func()
int a = 42;
En el primer caso, el punto y coma no está directamente después de la declaración, pero estaría bien.
En el segundo caso hay un punto y coma "después" de la declaración, pero no directamente después.
Creo que Eric Lippert tiene la idea correcta en su respuesta .
Es como decir "¿debería haber un período después del final de una oración en inglés?". Podría decirse que una oración ya tiene un punto al final (de lo contrario no sería una oración) y, por lo tanto, no debería haber un período después de la oración.
Es una pregunta difícil, pero usaron la palabra declaración que significa algo como esto:
int example();
Así que es cierto en este caso.
Si hubieran usado la palabra implementación, entonces habría sido falso.
Esto depende de si estamos declarando o definiendo la función.
Si estamos declarando la función, necesitamos incluir el punto y coma (
;
), y si estamos definiendo la función, el punto y coma no es necesario.
Una declaración es así:
int add(int, int);
Y una definición es así:
int add(int a, int b)
{
// ...
}
Las otras respuestas y comentarios mencionan varias de las muchas maneras en que esto es una pregunta horrible, engañosa y mal escrita. Pero hay otro problema que nadie más ha identificado aún. La pregunta es:
No se necesita un punto y coma ('';'') después de una declaración de función. Verdadero o falso.
OK, veamos una declaración de función:
int func(); /* */
/* ^ */
/* | */
/* That whitespace is "after the function declaration". */
Todo eso es la declaración
.
La declaración no es
int func()
y luego
sigue
una
;
.
La declaración es
int func();
y luego es seguido por espacios en blanco.
Entonces, la pregunta es: ¿se necesita un punto y coma
después de la declaración
?
Por supuesto no.
La declaración ya tiene un punto y coma que la terminó.
Un punto y coma después de la declaración sería inútil.
Por el contrario,
int func(); ;
int func(); ;
sería un punto y coma
después de una declaración de función
.
La pregunta estaba destinada casi ciertamente a hacer la pregunta "verdadero o falso: el último token en una declaración de función es siempre un punto y coma" Pero esa no es la pregunta que escribieron, porque el autor del cuestionario no estaba pensando claramente en el problema.
Mi consejo es evitar por completo las pruebas de lenguaje de programación. Son bastante horribles.
Dato curioso, mientras estamos en el tema. En C #, estos son todos legales:
class C {}
class D {};
struct E {}
struct F {};
En C #, una declaración de clase o estructura puede terminar en un punto y coma, o no, a su discreción. Esta extraña característica se agregó para el beneficio de los programadores de C / C ++ que vienen a C # y tienen en sus manos que las declaraciones de tipo terminan en un punto y coma sin sentido; El equipo de diseño no quería castigarlos por tener este hábito. :-)
Puede tener una situación en la que declare y defina la función en un solo paso, es decir, si incluye la definición de la función en el punto donde la está declarando. Así que técnicamente supongo que la verdad es correcta. Pero la pregunta está redactada de tal manera que yo la habría respondido de la manera que tú lo hiciste.
Puedes declarar una función como esta también:
int func(){
return 1;
}
La afirmación es muy ambigua. La respuesta correcta debe ser: depende de cómo declare la función.
De todos modos, yo también habría elegido false, y tal vez usted pueda informar la pregunta a alguien.
Usted puede utilizar
;
Sólo para prototipos.