解释C ++中声明性谬误的最佳方法是什么?

时间:2009-09-01 06:42:50

标签: c++ declarative procedural

如何能够很好地解释为什么下面的代码不正确,因为作者试图以声明方式而不是程序性地编写C ++代码?

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;
}

作者希望cout能够显示正确的计算结果,而是获得“疯狂的数字”。

我会解释为“C ++是程序性的,因此在声明时

pounds = newtons/NEWTONS_PER_POUND;

newtons尚未分配值。

有什么更好的建议吗?或者解释为什么C ++不够“聪明”来执行用户错误预期的行为?

9 个答案:

答案 0 :(得分:21)

告诉作者

pounds = newtons/NEWTONS_PER_POUND;

命令CPU

  • 取名为“newtons”的地址
  • 取值为“NEWTONS_PER_POUND”
  • 的地址
  • 分开他们
  • 将结果存储在称为“磅”的地址

他正在寻找的东西很可能是命令式的功能:

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;

答案 1 :(得分:18)

C ++是一种命令式编程语言,而不是方程求解器。

C ++按照您编写语句的顺序执行语句。除非被告知,否则C ++不会初始化变量。 C ++允许您使用其值尚未初始化的变量,但是当您执行此操作时,结果是未指定。没有指明任何可能发生的事情,包括产生“疯狂数字”等坏事。

以下是详细说明:

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

第一个语句声明了两个变量而没有初始化它们。此时,它们的值未指定。

第二个语句读取newtons(可以是任何内容)的值,并将其除以NEWTONS_PER_POUND。结果(可以是任何内容)分配给pounds

第三个语句初始化newtons,但影响我们刚刚执行的计算为时已晚。

答案 2 :(得分:8)

不管学生的背景如何,这都不应该太难解释:只是他们认为C ++一次一步地评估程序,声明之后的语句(尽管编译工件如重新排序......)。

C ++处理这种方式绝对没有什么特别之处,甚至也不限于计算机编程 - 相反,它是处理有序指令列表的日常方式。

答案 3 :(得分:4)

这不是懒惰的评估牛顿

因此,计算在申报时进行,而不是在要求时进行。他是在功能代码之后,而不是C ++会做什么。

答案 4 :(得分:4)

如果这个人没有过于技术性,你可以试试:

“这个C ++程序中的语句类似于制作蛋糕所需的步骤。您必须逐个执行这些步骤,并且必须按特定顺序执行它才能获得成功。”

答案 5 :(得分:1)

说明在赋值运算符的行上为磅赋值:

pounds = newtons/NEWTONS_PER_POUND;

如果不是这种情况,但是在使用它时评估磅数(与cout语句一样),那么如果牛顿的值发生变化,那么磅的值也会发生变化。由于磅不是任何类型的指针,而是一个简单的整数,这是不可能的。

答案 6 :(得分:1)

如何在调试器中单步执行代码?

IME没有这样的东西来理解用过程语言编写的程序的执行(即模仿CPU实际执行代码的方式)。

答案 7 :(得分:0)

你正试图让听众进行范式转换 - 改变他/她的整个方法来理解这段代码。

  

“磅”只是一个数字。没有   它是如何创造的概念。你说   “磅”它是如何创造的,它不会   记得。它会记住什么   它不是如何被创造的。

对于一块记忆来说,拟人化似乎有点奇怪。 : - )

答案 8 :(得分:0)

采用稍微复杂的示例,其中重复使用newtons之类的变量并多次分配值。例如:

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;

向他展示代码和输出。然后让他解释程序如何以及为什么为每一行产生不同的数字。我认为这应该有助于推动他将程序视为从上到下的程序。