如何能够很好地解释为什么下面的代码不正确,因为作者试图以声明方式而不是程序性地编写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 ++不够“聪明”来执行用户错误预期的行为?
答案 0 :(得分:21)
告诉作者
pounds = newtons/NEWTONS_PER_POUND;
命令CPU
他正在寻找的东西很可能是命令式的功能:
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;
向他展示代码和输出。然后让他解释程序如何以及为什么为每一行产生不同的数字。我认为这应该有助于推动他将程序视为从上到下的程序。