解释 C++ 中声明性谬误的最佳方式?
-
20-09-2019 - |
题
由于作者试图以声明方式而不是过程方式编写 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;
显示他两个码和输出。然后问他解释的程序如何以及为什么会产生每行一个不同的数字。我认为,应该推助他在观看该节目为从顶层运行到下一个程序的方向。