☆☆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"や

文字列データ "ハロ~"



つまり


          💖文字列データを💖


        メモリに格納するために使われる

            

              配列


の知識


が必要となります。


といっても


              配列



全然難しくありません







  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る