Pregunta

¿Cómo podría uno diseñar una buena explicación de por qué el siguiente código no es correcto, en el que el autor está intentando escribir código C ++ de forma declarativa en lugar de procesalmente?

const double NEWTONS_PER_POUND = 4.448;

int main()
{
   double pounds, newtons;
   pounds = newtons/NEWTONS_PER_POUND; /* pounds equals 'unassigned variable'/4.448 */
   newtons = 10.0;
   cout << pounds << endl;             /* a big number, not 10.0/4.448 */
   return 0;
}

El autor cout espera que muestre un cálculo adecuado, sino que obtiene un "número loco."

Me gustaría explicar esto como "C ++ es de procedimiento, y por lo tanto en el momento de la declaración

pounds = newtons/NEWTONS_PER_POUND;

newtons no se ha asignado un valor.

Cualquier mejores sugerencias? O una explicación de por qué C ++ no es suficientemente "inteligentes" para llevar a cabo el comportamiento erróneamente espera que el usuario?

¿Fue útil?

Solución

Dile que el autor

pounds = newtons/NEWTONS_PER_POUND;

comandos de la CPU

  • tomar el valor en la dirección a que se refiere como "newton"
  • tomar el valor en la dirección a que se refiere como "NEWTONS_PER_POUND"
  • dividirlos
  • almacenar el resultado en la dirección que se hace referencia como "libras"

lo que está buscando es muy probablemente una función en términos imperativos:

double newtons_to_pounds(double newtons) {
  return newtons/NEWTONS_PER_POUND;
}

...

newtons = 10.0;
cout << newtons_to_pounds(newtons) << endl;    /* a big number, not 10.0/4.448 */
return 0;

Otros consejos

C ++ no es un lenguaje de programación imperativo una resolución de ecuaciones.

C ++ ejecuta las instrucciones en el orden en que los escribe. C ++ no inicializa las variables a menos que se le dice a. C ++ permite el uso de una variable cuyo valor no se ha inicializado, pero al hacer esto el resultado es no especificado . medios no especificados que puede pasar cualquier cosa, incluyendo cosas malas, como la producción de "números de locos".

Aquí está la explicación detallada:

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;

La primera sentencia declara dos variables sin inicializar ellos. En este punto, sus valores no se especifican.

La segunda instrucción lee el valor de newtons (que podría ser cualquier cosa) y lo divide por NEWTONS_PER_POUND. El resultado (que podría ser cualquier cosa) es asignado a pounds.

La tercera sentencia inicializa newtons, pero es demasiado tarde para afectar el cálculo que acabamos de realizar.

Bueno, eso no debería ser demasiado difícil de explicar, independientemente de los antecedentes de los estudiantes: sólo les Thell que C ++ evalúa programas de un paso a la vez, declaración tras declaración (a pesar de los artefactos del compilador como reordenamiento ...)

No hay absolutamente nada especial para C ++’manera de manejar esto, ni siquiera es limitado a la programación informática -. Más bien, se trata de una forma cotidiana de tratar con una lista ordenada de instrucciones

No es newtons evalúan perezosos

A medida que el cálculo de este tipo se realiza en el momento de la declaración, no en el momento de la solicitud. Es después de código funcional, no lo hará C ++.

Si la persona no es excesivamente técnico podría intentar:

"Las declaraciones de este programa en C ++ son como los pasos necesarios para hacer un pastel. Usted debe realizar los pasos uno a uno y se les debe llevarse a cabo en un orden determinado para que sea un éxito."

Explicar que libras se le asigna un valor en la línea con el operador de asignación:

pounds = newtons/NEWTONS_PER_POUND;

Si este no fuera el caso, pero que se evaluó libras cuando fue utilizado (al igual que con la declaración cout), a continuación, si el valor de newtons cambiado, entonces el valor de libras iba a cambiar también. Desde libras no es cualquier tipo de puntero, pero es un número entero simple, esto no es posible.

¿Qué hay de recorrer el código en un depurador?

IME no hay nada como esto para entender la ejecución de un programa escrito en un lenguaje de procedimiento (es decir, el modelo de cómo la CPU ejecuta realmente el código).

Usted está tratando de llegar al oyente a someterse a un cambio de paradigma -. Para cambiar su / su totalidad aproximación a la comprensión de este código

  

"libras" es sólo un número. Tiene sin   concepto de cómo su creación. usted le dice   "Libras" cómo se creó, no lo hará   recuerda. Se acaba de recordar lo   que es, no cómo se crea.

Puede parecer un poco extraño a antropomorfizar un bloque de memoria. : -)

Tome un poco más compleja ejemplo en el que una variable como newtons se reutiliza y los valores asignados más de una vez. Por ejemplo:

double pounds, newtons;

newtons = 10.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

newtons = 15.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

return 0;

Mostrar lo tanto el código como la salida. Luego pedirle a explicar cómo y por qué el programa produce un número diferente para cada línea. Yo creo que debería ayudar a empujar en la dirección de la visualización del programa como un procedimiento que va de arriba a abajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top