#include <iostream>
int main() {
while (true) {
int x, y;
std::cin >> x >> y;
if (x == 0 and y == 0) break;
if (x < y) { std::cout << x << " " << y << std::endl; } else { std::cout << y << " " << x << std::endl; }
}
return 0;
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上のソースコードは模範解答です。
2つの整数 x, y を読み込み、それらを値が小さい順に出力するプログラムを書きたいです。
while文を書く前に、x,yの初期値を設定しようと思ったのですが、この問題には必要がありませんでした。
初期値の定義が必要な時とそうでないときの違いをご教授いただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
初期値の定義が必要な時とそうでないとき
初期化していない変数の値というのは不定(値がどうなってるのかわからない).
で,ある変数の値を用いる処理を実施するタイミングで,その変数の値が「どうなってるのか不明」っていうのだと,まぁ普通は 困る/意図した動作を達成できない/etc... よね,っていうだけの話.
なので「変数の値を使うよりも前の段階でちゃんと値を入れておきましょうよ」と普通は考える.
その手段が「初期化」とか「代入」.
だから,「俺は 絶対に この変数の値を用いるよりも前の段階で何か値を代入するぜ!」っていうコードを書くのであれば,初期化は必須ではない.
C++
1int x; //初期化しないけども… 2... 3x = 42; //まず何か値を代入してから… 4std::cout << x; //xの値を用いるのならば問題無い
あなたのプログラムの場合だと,最初に変数 x
と y
の値を用いた処理をしているのは
if (x == 0 and y == 0) break;
というところだけど,この時点までにおいて変数 x
や y
を{初期化しておらず,且つ,一度も値の代入もしていない}としたら,この時点での値は上記の「不定」な状態なわけなので,
そしたら「たまたま両者の値が0だったならばこの if
の条件を満たしてしまうし,そうでないならば満たさない」という(予測不能な)動作をすることになる.
で,この if
よりも前の段階でこれらの変数に値を入れている処理がありますか? っていうと,該当するのは
std::cin >> x >> y;
になるけども,この処理って必ず成功するわけじゃないよね.
例えば Hello
とか何とかてきとーな入力が成された場合はどうなるのか?
入力次第では x
や y
への値の代入というは行われないかもしれないよね.
……というわけで,このプログラムに関して言えば,
「入力の失敗はあり得ない/そういうイレギュラーは考えない」という前提としても良いという話なのであれば,初期化は無くても良いということになるだろう.
そうでないならば(:あらゆる入力があり得るという前提であれば)変数 x
や y
には何かしらの 適切な初期値 というのを与えておくとか,あるいは入力処理の失敗を判定して何か手を打つ(:未入力の x
や y
が用いられないようにする)だとか,相応の対応を入れる必要がある.
投稿2024/09/06 00:19
編集2024/09/06 00:22総合スコア11942
0
「初期化」とは曖昧な言葉です。普通には「変数に対しての最初の代入」ですかね。
宣言と同時に値を与えることのみに限定して使う人もいるようです。
int x=10;
だけ書くのと、 (あらかじめint x;
しておいて)x=10
するのと、両方を初期化というか、前者のみを初期化というかの違い。
このコードだと、std::cin >> x >> y;
が宣言後の初めての代入なので(=
は使ってませんが)、強いて言うと、これが初期化でしょう。私個人はこの場合にそういう言葉は使いませんが。
int x,y;
でなくint x=-1, y=99;
のように書くのは、その直後にcin
で代入するので意味ないかというと、
std::cin
に対して、EOF(Unix/LinuxだとCtrl-Dを押す)が来ると、代入は実行されないのでx
は-1
、y
は99
のままで、全く意味が無いわけでは無いです。
が、それを積極的に利用するのは良いとは思いません。
int x=0;
の直後にx = 10;
とか書いてあるようなコードの場合は、「int x=0;
の0
にどんな意味を込めて書いたのか?」と聞いてみたいですが、何も考えてないでしょうね。
初期値の定義が必要な時とそうでないときの違いをご教授いただければ幸いです。
変数から値を取り出すという処理(例えば、std::cout << x;
のx
とか、a = x + y;
のx
やy
とか)の前には、その変数への値の代入が必要です。代入してない変数から値を取り出すと、言語によって違いますが、エラーになる場合もあるし、そのときたまたま変数の位置のメモリーに入っていた値(0とは限らない)が参照されて、エラーにならない場合もあります。
やるべき事は、「使う前には代入しましょう」というそれだけです。
宣言と同時でも良いし、別でもよい。どちらにするかは開発のルール次第ですかね。
(宣言と同時の場合には「代入」とは呼ばないケースもありますが、意味的には同じです)
投稿2024/09/06 03:14
総合スコア85607
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自己解決
反復処理の値なのか、自由な値なのかによって、whileの前に定義するかどうかを決めるんだと気が付きました!
お騒がせいたしました!
投稿2024/09/05 10:30
総合スコア2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/06 04:31
2024/09/06 06:59
2024/09/06 11:13
2024/09/09 07:39
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/06 01:04
2024/09/06 01:54
2024/09/06 07:05
2024/09/06 07:28