¿Cuál de estas respuestas con respecto a las funciones es incorrecta?


17

Entonces, mientras hacía compilaciones largas, decidí hacer la prueba general de C ++ en ODesk y me encontré con esta pregunta.

Esta pregunta

Si no me equivoco, dada la redacción (o la falta de ella), todo esto podría ser cierto.

a.

int Foo() { }
int Foo(int bar) { }

si. Bueno, return void;sería incorrecto semánticamente, pero las funciones obviamente pueden tener voidtipos de retorno.

void Foo() { }

C. Esta es la definición de funciones en línea, sí.

re. Sin entrar en muchos detalles sobre la colocación de los siguientes elementos,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Además, siempre puedes hacer esto usando lambdas y functors .

mi.

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

F.

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

sol.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

No veo dónde esta pregunta tiene respuestas verdaderamente falsas . ¿Me estoy perdiendo de algo?

No hace falta decir que se me acabó el tiempo y fallé todo. Supongo que soy un mal programador de C ++. :(


18
Vine aquí para gritarle a un niño que pegaba tarea, estaba gratamente sorprendido.
SomeKittens

En realidad, no todos los idiomas requieren que se expandan las funciones en línea. "en línea" es una sugerencia del compilador en lugar de un comando en Delphi, y C, C ++ tienen excepciones . Entonces "c" puede ser falso también. Puede ser más entretenido escribir una respuesta que muestre cómo cada afirmación puede estar equivocada.
Más

1
@ Ӎσᶎ Si solo hubiera un cuadro de texto. Quiero volver y presionar "Informar un problema con esta pregunta".
Qix

55
Ese no es un conjunto de funciones. Esa es una matriz de punteros de función.
user253751

@immibis Cierto, pero la pregunta realmente no aclara (al menos para mí no lo hizo).
Qix

Respuestas:


21

Toda esta pregunta es dudosa. El enunciado de la pregunta implica la posibilidad de múltiples opciones, mientras que los botones de opción indican una sola opción.

Además, b es bastante sospechoso, ya que las funciones nulas no devuelven nada.

D también es cuestionable, por lo que yo sé, no puedes tener una variedad de funciones. Claro, puede tener una variedad de punteros de función, pero eso no es exactamente lo mismo.


Derecho; D es como preguntar si puedes llamar a un int. Claro, si lo lanzas a un puntero y ese puntero se refiere a una función ...
Qix

1
Estoy dispuesto a apostar que D es la respuesta que buscan, pero sí, la pregunta es pobre.
Gort the Robot

Si bien las voidfunciones no devuelven ningún valor , aún devuelven el tipo void . Por eso digo que B es cierto.
Thomas Eding

@ThomasEding Esa es una redacción muy mala de su parte. No return void;, pero en su lugar return;.
Qix

10

La respuesta c) también es posiblemente falsa.

"Las funciones en línea se expanden durante el tiempo de compilación para evitar la sobrecarga de la invocación".

En primer lugar, el compilador de C ++ puede ignorar la inlinesugerencia al no expandir las funciones en absoluto.

En segundo lugar, la "razón" declarada para hacer la expansión es una simplificación excesiva. De hecho, la verdadera razón para hacer la expansión (o no) está totalmente en manos del escritor compilador.


Tiene razón, pero yo estaba pensando en ello en el sentido de 'bien, el compilador ha determinado que no quieren una función inline' en lugar de la inlinepista.
Qix

Bueno, el compilador no puede ignorar por completo la pista. Al menos es un efecto obligatorio, haciendo una excepción a ODR.
Deduplicador

@Deduplicator: sí, puede. "No importa cómo designe una función como en línea, es una solicitud que el compilador puede ignorar: el compilador podría expandir en línea algunos, todos o ninguno de los lugares donde llama a una función designada como en línea". - fuente isocpp.org/wiki/faq/Inline-Functions
Stephen C

@StephenC: la solicitud para expandirlo en línea se puede ignorar, sí. Solo dije que la excepción explícita a la ODR no puede.
Deduplicador

Veo. He actualizado la redacción de mi respuesta
Stephen C

7

C. Esta es la definición de funciones en línea, sí.

Eso no es completamente correcto.
A pesar de su nombre, la palabra clave inlineno garantiza que una función esté en línea. Lo único de lo que puede estar seguro es que el compilador no se quejará si ve la definición de una función en línea varias veces.

Entonces, estrictamente hablando, la opción C es incorrecta, pero no creo que sea la respuesta que esperan los autores del cuestionario, porque hay una respuesta que es aún más incorrecta.

re. Sin entrar en muchos detalles sobre la colocación de los siguientes elementos,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Además, siempre puedes hacer esto usando lambdas y functors.

En su ejemplo, functionses una matriz de punteros a funciones y no una matriz de funciones en sí. Del mismo modo, las lambdas y los functores tampoco son realmente funciones. Son clases que responden al operador de llamada a función, pero eso no las convierte en funciones a los ojos de la definición del lenguaje C ++.

Las funciones en C ++ son un poco como los ciudadanos de segunda clase. Puede definirlos y llamarlos, pero tan pronto como intenta hacer algo más con un tipo de función (como crear una matriz de ellos), obtiene un error o se convierten silenciosamente en un puntero.


Estoy de acuerdo con el bit D, pero estaba leyendo ccomo funciones que ya se han marcado positivamente para la inclusión, en comparación con la inlinepalabra clave en sí. Entiendo que inlinees una pista.
Qix

4

En todo caso, tendría que ser b . No puedes returna void, pero puedes devolver a null. Nulo en la declaración de función debe estar allí para notificar al compilador la falta de un valor devuelto

Tipo de vacío

En C y C ++

Una función con tipo de resultado nulo finaliza al llegar al final de la función o al ejecutar una declaración de retorno sin valor devuelto. El tipo vacío también puede aparecer como el único argumento de un prototipo de función para indicar que la función no toma argumentos. Tenga en cuenta que a pesar del nombre, en todas estas situaciones, el tipo de vacío sirve como un tipo de unidad, no como un tipo cero o inferior, aunque a diferencia de un tipo de unidad real que es un singleton, se dice que el tipo de vacío comprende un vacío conjunto de valores, y el lenguaje no proporciona ninguna forma de declarar un objeto o representar un valor con tipo void.


2
-1: Si bien las voidfunciones no devuelven ningún valor , aún devuelven el tipo void . Por eso digo que B es cierto.
Thomas Eding

Volver vacío es permitido bajo algunas circunstancias. Ver aquí .
Josh Kelley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.