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

yba*_*kos 6 c++ procedural declarative

人们如何能够很好地解释为什么以下代码不正确,因为作者试图以声明方式而不是程序性地编写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;
}
Run Code Online (Sandbox Code Playgroud)

作者希望cout显示一个正确的计算,但获得一个"疯狂的数字".

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

pounds = newtons/NEWTONS_PER_POUND;
Run Code Online (Sandbox Code Playgroud)

newtons 尚未分配值.

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

Zed*_*Zed 21

告诉作者

pounds = newtons/NEWTONS_PER_POUND;
Run Code Online (Sandbox Code Playgroud)

命令CPU到

  • 取地址上的值称为"牛顿"
  • 取该地址的值称为"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;
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 18

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

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

这是详细的解释:

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;
Run Code Online (Sandbox Code Playgroud)

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

第二个语句读取newtons(可能是任何东西)的值并将其除以NEWTONS_PER_POUND.结果(可以是任何东西)被分配给pounds.

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

  • @silky:"m(++ x);" 是一个声明. (3认同)

Kon*_*lph 8

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

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