天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.789 RELIEF
☆☆printf("%d",10);とprintf("10");の違いについての考察してみませんか?
☆☆printf("%d",10);とprintf("10");の違いについての考察してみませんか?
☆☆printf("%d",10);とprintf("10");の違いについての考察してみませんか?
ソーラー
「いままでみてきたように
以下のプログラムを実行すると
%d出力変換指定子はprintf関数の第2引数である数値10を
printf("")の" "内に取り込んで
10をコマンドプロンプト画面に表示することになるんだよ(*´▽`*)
(コマンドプロンプト画面とは
プログラムの実行結果が表示される黒い画面のことです)
#include <stdio.h>
int main(void)
{
printf("%d\n",10);
return 0;
}
プログラムの実行結果
10
%d出力変換指定子のはたらきは
🍊printf関数の引数である整数値を
10進数の整数値に変換して出力するよう指定する🍊
ことにあります。
10進数は英語でdecimalといいます
%dのdはこのdecimalのdです
<><><><><><><><><><><><><><>
⇧そんなの あたりまえじゃないか・・・
と思われる方も おられるかもしれませんが
このほかにも
引数である
数値10を8進数になるよう変換して
printf("")の" "に囲まれた文字列内の%oに格納する%o出力変換指定子
引数である
数値10を16進数になるよう変換して
printf("")の" "に囲まれた文字列内の%xに格納する%x出力変換指定子
などがあります。
<><><><><><><><><><><><><><>
ソーラー
「
#include <stdio.h>
int main(void)
{
printf("%d\n",10);
return 0;
}
の実行において
10進数の10になるよう
printf関数の引数10は
printf("")のダブルクォーテーション" "内の文字列の中で%dと
記されている部分にとりこまれます。
そして%d出力変換指定子により10に変換され
文字列データ"10"
が
printf関数によってコマンドプロンプト画面に
10
と表示されます。
ここまでは いいかな(*^^*)」
ここで1段落かな?
ソーラー
「printf("")のダブルクォーテーション" "内の
%dの部分に10が取り込まれると
文字列データ"10"が生成されることになります
コンピュータによって計算可能な数値データ10ではありません
printf("")のダブルクォーテーション" "内に格納された
データは文字列としてコンピュータに認識されます。
"おはよう"
も
"10"
も
文字列データとなります
10は数値データ
で
"10"は文字列データ
となっている?
意味が解らないですよね。
ここで次の2つの命令文をくらべてみましょう。
1;printf("%d",10);
2;printf("10");
両方とも実行すれば10とコマンドプロンプト画面に表示されます。
しかし
1のほうは
10という数値データを%d出力変換指定子をつかって
" "のなかにとりこみ
"10"
となったものを
printf関数を使い10と表示しました。
2の方はふつうにprintf("10");のように
" "のなかに文字列と記述された10を
printf関数を使い10と表示しました。
💖" "のなかに記述されたデータは💖
💖たとえ数値データであっても文字が記述されているとみなされます💖
まあ、ただ単に%dを使って数値データ10を" "のなかの%dにとりこむか
もろにprintfの( " " )のなかに文字列として10をかきこむか
の違いなんですが・・・
両方ともおんなじかも・・・
いや・・・
🌞1;printf("%d",10);
のプログラムはコンピュータに
//この数値10のデータを
printfの( " %d" )のなかの%dのある部分にとりこんで
文字列データ"10"
とし
コマンドプロンプト画面に
10
として出力表示せよ!//
という命令文なんだ。
だから
まずは
💖数値データ10を保存している場所(メモリー)が存在することになる。💖
🌞2;printf("10")の10は
最初から
printf("")のダブルクォーテーション" "内に格納されているよね。
このとき
10は単なる文字列(文字の集まり)で
"10"という文字列データになっているわけなんですね。
🌞1の場合の数値データ10が取り込まれているメモリの場所と
🌞2の場合の文字列"10"が取り込まれているメモリの場所は
違うというわけです。
となると
printf("%d",10);
と
printf("10");
の違いとは
数値データ10を%d出力変換指定子をつかって" "のなかにとりこみ
文字列データ"10"
printf出力表示するか
文字列データ"10"をprintf出力表示するか
の違いといえるかな?」
マックス
「その説明を
もう1回、もう1回、もっと わかりやすく説明してくれ。してくれ。
してくれえ(^^)/」
ぶーにゃん 「おねがいにゃーん(^^)/」
明るく元気におねだりする猫。
ソーラー
「では もう一回少々表現を変えて説明っと・・・
ここで間違いやすいのは
printf("%d",10);
が命令文というところです。
このprintf("%d",10);
以前に数値10に関するプログラム上の記述は
ありません。
どういうことかというと
printf("%d",10);
というと
最初から
どこかのメモリに10という数値データが格納されていて
それを%dの部分にとりこんでprintf出力表示する という感じに
とらえられやすい。が
そーいうことではありません。
つまり
最初から コンピュータ内の
どこの記憶装置(メモリ)にも数値10は格納されていません。
ですから
printf("%d",10);
という命令文においては
まず 数値データ10がどこかの記憶装置(メモリ)に格納されているんです
もうすこし説明すると
//数値10データをどこかの記憶装置(メモリ)に格納する//
という命令
それがprintf("%d",10);という命令文に
含まれているんです
printf("%d",10);
というと簡単な命令文にみえますが
いろいろな命令が組み合わされているのですね
この
printf("%d",10);
という命令文を細かく分解すると
まず
🍊数値データ10をどこかの(記憶装置)メモリに格納せよ!🍊
次に
🍊%d出力変換指定子のルールに則って
(この場合は数値10を10進数数値10に変換してという意味でしたね。)
数値データ10を格納している(記憶装置)メモリから
10を
printf("")のダブルクォーテーション" "内の%dのある部分にもってきて
文字列データ
"10"に変換
それを
printfによってコマンドプロンプト画面に出力表示せよ!🍊
となっているんだ
つまり
もっと根本的にいいかえると
💖数値データ10を格納している(記憶装置)メモリ💖
と
💖"%d"の管理しているメモリが💖
別々にあることになるんだ
そして
数値データ10が
"%d"
の%dの部分に取り込まれて
"10"
になっているというわけなんだ
それに対し
printf("10");
のように記述された10は
コンパイルされて
printf("10");
が実行されたなら
まず
最初に文字列データ"10"がメモリに格納される。
そのとき
だから
printf("%d",10);
と
printf("10");
の違いとは
10というデータが最初
どこの(記憶装置)メモリ
に保存されるかの違いかな。
ふふ
どうかな?」
マックス 「おっ それ なんかいい感じじゃないか。あ~多分そう。」
ぶーにゃん 「すごーいにゃん。よく思いついたにゃん(^^)」
ソーラー 「はははっ 読者様のためですよ(^^)」
たぶんです(笑)でも多分あっているし
それほどまちがってはいないとおもう
難しかったでしょう。
ありがとうソーラー
solarplexussより
ソーラー「いやぜんぜん難しく考えたりしませんでしたよっ。
楽しいばっかりでしたよ。たまたま散歩しながら
自由に考えてたら
なんか おもいつきました。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
printf("%d",10);とprintf("10");の違いについての考察
ソーラーはいい勘していますね。
よくここまで見抜いたと我等の仲間ながら感心します。
このときのソーラーたちの知識ではこの問題をとくことは
できないはずなのに・・・
数値や文字列データを格納する入れ物が
いろいろあるということがわかってくると
このことは自然により詳しく理解できることになるでしょう
実はprintf("%d",10);のなかの10
は
コンパイルされると
10から2進数00000000000000000000000000001010に変換されて、
あるメモリー領域(記憶装置の領域)
に格納されます。
この場合の
2進数00000000000000000000000000001010は
4バイト(後述)の容量の
メモリーにおさめられる方式になっています。
(メモリーには いろんな型がありますが
この4バイトの容量をもつメモリーは
整数値をおさめるint型とよばれます。)
そして%d出力変換指定子によって
そのメモリー内の2進数00000000000000000000000000001010
が 再び10進数10と%d出力変換指定されて
printf関数の" "内の%dの部分に整数値10が格納され
文字列データ"10"となり
コマンドプロンプト画面に10が出力表示されます。
それに対し
printf("10");の10はコンパイル後
実行されると
最初から
文字列データ"10"が
あるメモリ領域に格納されます
そうしてから
printf関数により
コマンドプロンプト画面に10が出力表示されます。
コマンドプロンプト画面に10が出力表示されるときは
""は消えるという仕組みになっています。
コマンドプロンプト画面に10が出力表示されるとき""が
消えるという仕組みは
全然関係ないですが
エスケープシーケンス\
と似ていますね。
どのように
コンピュータ内のメモリに
文字列データ"10"が格納されているかをより詳しく知るには
文字列データ"10"や
文字列データ "ハロ~"
を
つまり
💖文字列データを💖
メモリに格納するために使われる
配列
の知識
が必要となります。
といっても
配列
は
全然難しくありません
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます