由于作者试图以声明方式而不是过程方式编写 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++ 不够“智能”,无法执行用户错误预期的行为?

有帮助吗?

解决方案

告诉作者

pounds = newtons/NEWTONS_PER_POUND;

命令CPU

  • 取地址处的值“牛顿”
  • 取“NEWTONS_PER_POUND”地址处的值
  • 划分他们
  • 将结果存储在称为“pounds”的地址处

他正在寻找的很可能是命令式的函数:

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;

其他提示

C ++是命令性编程语言不是方程解算器。

C ++执行你写的顺序语句。除非它被告知C ++不初始化变量。 C ++允许你使用一个变量,其价值还没有被初始化,但是当你这样做的结果是未指定的。未指定的手段,而不是什么都可能发生,包括坏的东西像制作“疯狂的数字。”

下面是详细的说明:

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

第一个语句声明两个变量不初始化它们。在这一点上,它们的值是不确定的。

第二条语句读取newtons的值(其可以是任何东西),并通过NEWTONS_PER_POUND它除以。结果(其可以是任何内容)分配给pounds

第三条语句初始化newtons,但为时已晚,影响我们只是进行计算。

好了,不应该是很难解释清楚,无论学生的背景:刚刚thell他们说C ++评估程序一步步来的时候,声明语句之后(尽管编译器等文物重新排序...)

有绝对没有特别的C ++”的处理这种方式,也不是它甚至不限于计算机编程 - 更确切地说,它是处理指令的有序列表的日常方式

这不是懒惰评估牛顿

这样的计算在声明时进行,而不是在请求的时间。他是功能代码之后,不是C ++就可以了。

如果这个人是不是过于技术性的,你可以尝试:

“在此的C ++程序中的陈述是像做蛋糕所需的步骤。必须通过一个执行的步骤之一,他们必须以一定的顺序为它是一个成功执行。”

解释说磅被分配与所述赋值运算符行的值:

pounds = newtons/NEWTONS_PER_POUND;

如果不是这种情况,但是,当它被用来(与COUT声明),该磅评价,则如果牛顿的值改变,则磅的值将改变。由于磅不是任何类型的指针,但它是一个简单的整数,这是不可能的。

怎么样通过代码在调试器步进?

IME没有什么这样理解写在一个过程语言中的程序的执行(即,仿照CPU如何实际执行的代码)。

您正在试图让听众接受的模式转变 - 他/她的整个方法改变为理解这段代码

  

“磅”只是一个数字。它有没有   它创造了怎样的概念。你告诉   “英镑”它是如何创建的,它不会   记得。它将只记得什么   它是,它不是如何创建的。

它可能看起来有点奇怪anthropomorphise的内存块。 : - )

以一个略微更复杂的示例,其中相同的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;

显示他两个码和输出。然后问他解释的程序如何以及为什么会产生每行一个不同的数字。我认为,应该推助他在观看该节目为从顶层运行到下一个程序的方向。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top