Recientemente tomé una prueba de programación intermedia, y una de las preguntas que me equivoqué 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ígeme si me equivoco porque siento que me estoy volviendo loco), una declaración de función es lo que escribes antes de la definición (en la parte superior del código) para que el compilador conozca la función llame incluso antes 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?
c++
function
syntax
declaration
Logan
fuente
fuente
Respuestas:
Puede tener una situación en la que declara y define la función en un solo paso, es decir, si incluye la definición de la función en el punto donde la declara. Así que técnicamente supongo que cierto es correcto. Pero la pregunta está redactada de tal manera que la habría respondido de la manera que usted lo hizo.
fuente
Además de lo de "una definición es también una declaración", lo siguiente es C ++ legal:
Esto declara dos funciones
f
yg
, ambas sin argumentos y con un tipo de retorno deint
, pero la definición def
no es seguida (inmediatamente) por un punto y coma. Del mismo modo, esto es legal: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:
Aparte de una (mera) declaración de función, una definición de función no se puede combinar con ninguna otra declaración o definición para el mismo especificador de tipo . (Si esto fuera legal, definiría a
void *p
y avoid f() {}
).En cualquier caso, esto parece ser un tipo de pregunta "gotcha" que no debería estar en una prueba de programación intermedia.
(Ah, por cierto, por favor, no escriba código como
int f(), i = 42;
).fuente
typedef int fooProc(int); fooProc a,b.c.d.e;
no estoy seguro de por qué los encabezados estándar para compiladores basados en disqueteras no lo hicieron en el día, ya que creo que habría permitido que los archivos de encabezado fueran mucho más pequeños y, por lo tanto, más rápidos de procesar.int f(int(&g)(),int(*h)()){return g()+h();}
Esto tiene tres declaraciones de funciones, una de las cuales es seguida por una llave abierta, otra por una coma y una tercera por un paréntesis cercano.int f(stuff)
. Incluso en el ámbito de la función,g
es una variable automática de tipo referencia a función , yh
es un puntero para funcionar .Las otras respuestas y comentarios señalan varias de las muchas formas en que esta es una pregunta horrible, engañosa y mal escrita. Pero hay otro problema que nadie más ha identificado todavía. La pregunta es:
OK, veamos una declaración de función:
Todo eso es la declaración . La declaración no es
int func()
y luego sigue a;
. La declaración esint func();
y luego es seguida 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 no tendría sentido. Por el contrario,
int func(); ;
sería un punto y coma después de una declaración de función .La pregunta seguramente tenía la intención de hacer la pregunta "verdadero o falso: el último token en una declaración de función siempre es un punto y coma" Pero esa no es la pregunta que escribieron, porque el autor del cuestionario no estaba pensando claramente sobre 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:
En C #, una declaración de clase o estructura puede terminar en punto y coma, o no, a su discreción. Esta pequeña y extraña característica se agregó para beneficio de los programadores de C / C ++ que vienen a C # y que la tienen en la punta de los dedos y 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. :-)
fuente
También puede declarar una función como esta:
La declaración es muy ambigua. La respuesta correcta debería ser: depende de cómo declare la función.
De todos modos, también habría elegido falso, y tal vez puedas informar la pregunta a alguien.
fuente
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 ninguna declaración.
Muchos tipos de declaración tienen que terminar con un punto y coma, como lo especifica la sintaxis en la sección 7 [dcl.dcl]. Pero nunca hay necesidad de escribir un segundo después de eso.
fuente
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í:
Y una definición es así:
fuente
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:
Supongo que la pregunta se hizo con esta terminología en mente.
Definición y declaración son el mismo concepto a mis ojos. "Defino x = y" == "Declaro x = y".
Pero, por supuesto, hay una gran diferencia entre el prototipo de la función (en la parte superior) y la definición real de la función.
fuente
void func();
es exactamente equivalente avoid func(void);
. Esto es muy diferente de C , dondevoid func();
no le dice nada al compilador sobre los argumentos, y no es lo mismo quevoid func(void);
. Un prototipo o definición posterior es una buena idea, de lo contrario, la persona que llama tiene que aplicar las promociones arg predeterminadas (por ejemplo, flotante -> tipos enteros dobles y estrechos aint
. Las mismas reglas que para argumentos a funciones variadas).Es una pena que la pregunta que tomaste no diga "directamente después". Podríamos, por ejemplo, escribir esto:
O podría escribir:
En el primer caso, el punto y coma no está directamente después de la declaración, pero eso 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 punto 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 punto después de la oración.
fuente
int func() int a=42;
no compila Necesitas una coma, no otraint
. Vea la respuesta de @ Arne publicada un día antes de esto. Lo único nuevo en esta respuesta es el último párrafo, con la analogía de las oraciones en inglés.Puede usar
;
solo para prototipos.fuente
Es una pregunta difícil, pero usaron la palabra declaración que significa algo como esto:
Entonces es cierto en este caso.
Si hubieran usado la palabra implementación, entonces habría sido falso.
fuente
Semicolon (;) se usa para decirle al compilador que después de este punto y coma (;) comienza una nueva instrucción.
Así que creo que el punto y coma (;) se requiere solo durante una declaración de función. Entonces, según yo, la respuesta será verdadera.
fuente
Cuando las funciones se definen antes de main () :
Cuando las funciones se definen después de main () :
fuente