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」と呼ばれるアドレスの値を取得します
- 「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;
他のヒント
C ++は、命令型プログラミング言語ではない方程式ソルバである。
C ++は、あなたがそれらを書くことを順番に文を実行します。それが語られていない限りC ++は、変数を初期化しません。 C ++を使用すると、その値が初期化されていない変数を使用することができますが、あなたはこれを行うと、結果はの未指定のです。何よりも、不特定手段は「狂気の数字」を生産するような悪いことを含め、発生する可能性があります。
ここでは詳細な説明です。
double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;
最初の文では、それらを初期化せずに2つの変数を宣言します。この時点で、その値は不定です。
2番目のステートメントは、(何もすることができた)newtons
の値を読み取り、NEWTONS_PER_POUND
ことによってそれを分割します。 (何でもかまいません)結果はpounds
に割り当てられます。
3番目のステートメントは、newtons
を初期化しますが、我々がちょうど行っ計算に影響するには遅すぎます。
生徒の背景に関係なく、これを説明するのはそれほど難しいことではありません。C++ がプログラムを一度に 1 ステップずつ、ステートメントごとに評価するすべてのものだけです (並べ替えなどのコンパイラのアーティファクトにもかかわらず)。
C++ のこれを処理する方法には特別なことはまったくありません。また、コンピュータ プログラミングに限定されるものでもありません。むしろ、これは順序付けられた命令リストを処理する日常的な方法です。
これは、ニュートンを評価怠け者ではありません。
このような計算ではなく要求時に、宣言時に実行されるように。彼はC ++が何をするか、機能コードの後ではありません。
人は過度に技術的でない場合は、試みることができる:
「このC ++プログラム内の文がケーキを作るために必要な手順のようなものです。あなたが1でステップ1を実行する必要があり、彼らはそれが成功するためには、特定の順序で実行されるようにする必要があります。」
ポンド代入演算子の行に値が割り当てられることを説明する:
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;
彼にコードと出力の両方を表示します。その後、プログラムは行ごとに異なる番号を生成する方法と理由を説明するために彼に尋ねます。私はそれが上から下に走るの手順として、番組を視聴する方向に彼をプッシュするに役立つはずだと思うだろう。