質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

673閲覧

c言語 一時変数 2変数の値入れ替え

wakarannnohana1

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/04/21 16:04

編集2020/04/21 16:06

a=1,b=2と定義したものを、a=2,b=1と反転させて表示させたい場合についての質問です。

#include<stdio.h>
int main(void){
int a=1,b=2;
int tmp;

tmp =a;
a=b;
b=tmp;

printf("a=%d,b=%d/n",a,b);

return 0;
}

このプログラムについてですが、私(初心者)の認識では、
tmp=aの時点で
a=1,b=2,tmp=a

a=bの時点で
a=b,b=2,tmp=a

b=tの時点で
a=b,b=tmp,tmp=a

となり、printfによって
a=b,
b=tmp
と誤って表示されるものだと思っています。
しかし実際には正しく表示されるので、私の認識のどこかが誤っているものと思われます。
どこが間違っているのか、また、なぜこのプログラムが正しく機能するのかを説明していただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/04/21 16:09

ああもう作っちゃったのか。編集の仕方を知ってるんだから前の質問を編集し直せばいいのに。
Zuishin

2020/04/21 16:12

修正の仕方を知らないのに修正してる不思議。
wakarannnohana1

2020/04/21 16:14

①間違えて作ってしまう ②新しく作ってしまう ③修正機能があったことに気づく ④新しい板への誘導をさせて頂く ⑤指摘を頂き、元板にコピーペースト ⑥今
dodox86

2020/04/21 23:09

「なぜ、"a=b,b=tmp\n"と表示されないのか?」と、勘違いに基づいて質問されているのかなと思いましたが違いますでしょうか。「a=b;で、aは、bと言うものになる」と勘違いされているとか。(さすがにそんなことはないか)a,b,tmpはC言語のコード上での変数の名前であり、変数表示の際はその変数の名前ではなく、中身の値が出力されます。(過去の質問回答が無く、質問者さんの現時点の理解度が推し量れないための確認です)
guest

回答2

0

ベストアンサー

実際に値を入れて考えてみましょう。

初期値

変数
a1
b2
tmp未定義

tmp=aの時点で

a=1,b=2,tmp=a

変数代入元
a1
b2
tmp1(a)

a=bの時点で

a=b,b=2,tmp=a

変数代入元
a2(b)
b2
tmp1(a)

b=tの時点で

a=b,b=tmp,tmp=a

※ 問題よりb=t -> b=tmpのtypoと解釈

変数代入元
a2(b)
b1(tmp)
tmp1(a)

ここ迄の認識に間違いはなしです。

a=b, b=tmp と誤って表示されるものだと思っています。

最後の結論の、「誤って」と思われてる箇所が、
実際は正しい件については、

b=tmp の時点の tmp に何が入っているのか考えてみましょう。

b=tmp の tmp は tmp=a (元aの値)なので、
結果 b=a と同じになります。


混乱しやすい要因として思い当るのは、
上記の表には文章に合わせ敢えて 「代入元」 として記載しましたが

a=b,b=tmp,tmp=a

これではどの時点での値かが、この文章だけでは不明瞭になってしまう点。
代数とは違い、代入命令を駆逐実行する手続きなので、
実行順序によって結果が異なる為、理解が曖昧になる等が考えられます。

例) tmp=a で、aは初期値の1なのか? a=b した後なので2なのか?
というように、実行順序に影響されます。
短い式なので直前コードを参照すれば済む話ですが、ここが混同しがちなポイント。

実際の値を入れて考えると、その様なことを考えなくて済むので、
理解しやすくなるはずです。
「代入元」の列を隠し、「値」に着目して変数と値の変化を追って見て下さい。

投稿2020/04/21 18:31

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakarannnohana1

2020/04/22 00:16

丁寧な回答をありがとうございます。 自分でもどこの部分で認識が間違っていたのかいまいちわからなかったのですが、『混同しやすい要因』のところで解説してくださったことが正にその間違いの要因であったように思います。 私はこれまで、回答者さんの仰る「代入元」にも新たな式を代入するものと誤認しておりました。 また、変数と値の二者を同一視していたことも誤認の要因の一つであったと、回答者さんの提示してくださった表によってわかりました。 そして、tmpのような値を定義されていない変数は初めは未定義として扱い、代入があった際に初めて値が付与されることも新しく知ることができました。 最後になりましたが、非常に初歩的な私の間違いに付き合っていただきありがとうございました。勉強になりました。
guest

0

下記のようになります。

tmp=aの時点で
aの値は1,bの値は2,tmpの値は1

a=bの時点で
aの値は2,bの値は2,tmpの値は1

b=tmpの時点で
aの値は2,bの値は1,tmpの値は1

となり、printfによって
a=2,b=1

投稿2020/04/21 22:43

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakarannnohana1

2020/04/22 00:18

回答ありがとうございます。本当に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問