![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
C++ではfor文の初期化時にカウンタ変数等の宣言ができますよね.
0°から360°を表示するプログラムの例なのですが,次のコードを見てください.
int main(void)
{
const double drad = 2 * M_PI / 6;
double rad;
rad = 0.0;
for (int i = 0; i <= 6; i++, rad+= drad) {
//cout << "rad: " << rad << endl;
cout << "deg: " << rad * 180.0 / M_PI << endl;
}
}
このプログラムを実行すると,0°から60°ごとに360°まで表示されました.
ここで,for文の初期化処理でradの初期化を行おうとして,
for (int i = 0, rad = 0.0; i <= 6; i++, rad+= drad)
とプログラムを書き換えたところ,表示値は
deg: 57.2958
deg: 114.592
deg: 171.887
deg: 229.183
deg: 286.479
deg: 343.775
となりました.
また,コメントアウトしてある行を有効にしてradの中身を直接表示させると,
rad: 0
rad: 1
rad: 2
rad: 3
rad: 4
rad: 5
rad: 6
といったように,radが整数値に丸められています.
int iをfor文の外で宣言して
for (i = 0, rad = 0.0; i <= 6; i++, rad+= drad)
としたときには,正しい角度の表示が行われました.
これは,for文の初期化時に変数宣言を行うとき,同時にほかの初期化処理を記述してしまったらその変数も同じ型の新しい変数として宣言されてしまうということなのでしょうか?
for (int i = 0, rad = 0.0;...
→int i と int rad がスコープ内の変数として新しく宣言される?
No.4
- 回答日時:
既に回答があるけど蛇足的に追加.
for (あれ; これ; それ) なんか
というのは, *だいたい*
{
あれ;
while (これ) {
なんか
それ;
}
}
と等価になります. つまり
for (int i = 0, rad = 0.0; i <= 6; i++, rad+= drad) なんか
は*だいたい*
{
int i = 0, rad = 0.0;
while (i <= 6) {
なんか
i++, rad+= drad;
}
}
と同じです.
ちなみに C でもだいたい同じ.
今まではずっとCで書いてきており、今回はそれと同じ感覚で
i=0;rad=0.0
while()
{...
となるものだと思っていました。
また、恥ずかしながら、
int A=0, B=1;
といった宣言時に初期化をする書き方ができることを知りませんでした。今までは
int A=0;
int B=1;
と書いてました^^;
だから最初に気がつかなかったんですね
新しいことも知れてよかったです。
ありがとうございました。
No.3
- 回答日時:
ついでに言うと
doubleには誤差が含まれています。
rad += drad
のように、doube+doubleを繰り返すと、誤差が溜まることがあります。
# たとえば、0.1+0.1+..... と100回繰り返した値!=10.0 と言う事が起こり得ます。
今回の場合は
rad = drad * i
とするのがよいでしょう。
詳しくは、「double 誤差」辺りで検索してください。
浮動小数点の計算誤差については少しだけ知ってはいましたが,なるほどこんな対処方法もあるんですね.
これはいいことを聞きました.ありがとうございました.
No.2
- 回答日時:
>また,コメントアウトしてある行を有効にしてradの中身を直接表示させると,
ループの外でいくつになっているのか?
というのも確認してみるとよかったかも知れませんな。
http://www.ksky.ne.jp/~seahorse/cpp/loopvar.html
とか。
VisualStudioなら… /Zc:forScopeオプションかな?
いや、違うか???
まぁ、実際の仕様書にあたった方がいいでしょう。
>ループの外でいくつになっているのか?というのも確認してみるとよかったかも知れませんな。
確かにそうですね.
初期化部分でintを宣言したときに,ループが終わったあとのradを表示させたら,ループ前の値のままでした.
これとは別に新しく変数がループ内に作られてこれが使用されていたということだったんですね.
回答ありがとうございました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- 数学 エステルレ博士の奇怪なABC予想の証明とは? 1 2022/04/18 15:37
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- 数学 オイラーの等式、πの単位である[rad]の取り扱い方について教えて下さい。 1 2022/12/25 17:49
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- 数学 勾配9.57%は何度で何radですか 7 2023/04/23 21:12
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
2の補数を計算するプログラム
-
迷路を脱出する経路探索プログ...
-
再起呼び出しの回数をカウント...
-
3のつく数と3の倍数を表示 C言語
-
C言語プログラミング 漸化式に...
-
乱数生成について
-
プログラミングの問題で分から...
-
異なるn個の整数からr個の整数...
-
カードシャッフルのブログラム...
-
コマンドプロンプトを使用して...
-
[初級]C言語:コマンドラインか...
-
argvのNULLチェック
-
C言語の問題
-
whileとifを使い偶数を出すには
-
C言語で簡単なパックマンゲーム...
-
C言語のプログラムについて(...
-
【C#】SQL文の中に変数を埋め込...
-
分数の足し算をさせるプログラ...
-
C言語のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
intとlongは同じ?
-
C言語で%を使わない余りの出し方
-
2の補数を計算するプログラム
-
再起呼び出しの回数をカウント...
-
画像の拡大・縮小
-
迷路を脱出する経路探索プログ...
-
分数の足し算をさせるプログラ...
-
OpenCVによる4値化について
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
ヌメロンのプログラム
-
C++で表を作成したいのです ...
-
複数の共有メモリの作成
-
カードシャッフルのブログラム...
-
whileとifを使い偶数を出すには
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
異なるn個の整数からr個の整数...
-
c言語プログラミングについて f...
-
条件が多い場合
おすすめ情報