• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:stackoverflowの回答)

stackoverflowの回答の理解ができない部分について

このQ&Aのポイント
  • stackoverflowの回答について理解できない部分があります。
  • 特に、convert関数内の変数が保存できないことや、表示される謎の値についてよく分かりません。
  • 返答ができる方がいらっしゃいましたら、ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>他の値が一体なんなのか分かりません。。 "01"はあり得るのですが、他はちょっと有り得ない…ですかねぇ。 処理系変わったらあり得るンだろうか……。 # なさそうですが。 >printf("%s = %s = %sn", convert(65,8), convert(65,10), convert(65,16)); で、まずconvert(65,16)が実行されます。 16進数2桁でconvert()内のstatic char buff[33]に「後ろに揃えた形で」"41"が入ります。 buff[0]~buff[29]は0が入った状態で…buff[30]が'4'、buff[31]が'1'、buff[32]が'\0'となりbuff[30]のアドレスが返されます。 返されたアドレスはprintf()の第4引数として保存。 次にconvert(65,10)が実行されます。 10進数2桁でconvert()内のstatic char buff[33]に「後ろに揃えた形で」"65"が入ります。 buff[0]~buff[29]は0が入った状態で…buff[30]が'6'、buff[31]が'5'、buff[32]が'\0'となりbuff[30]のアドレスが返されます。 返されたアドレスはprintf()の第3引数として保存。 次にconvert(65,8)が実行されます。 8進数3桁でconvert()内のstatic char buff[33]に「後ろに揃えた形で」"101"が入ります。 buff[0]~buff[28]は0が入った状態で…buff[29]が'1'、buff[30]が'0'、buff[31]が'1'、buff[32]が'\0'となりbuff[29]のアドレスが返されます。 返されたアドレスはprintf()の第3引数として保存。 ということで、"101"、"01"、"01"が表示されることになります。 ので、他の数字が出るのは…おかしい。ということに。

kendai912
質問者

お礼

詳しい解説ありがとうございます。 内部の動きが良く理解出来ました。 やはり「164」「140」「64」「40」はちょっとおかしいのですね。 納得しました。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

正確には「引数を積む順番」ではなく「引数を評価する順番」です>#4. そして, 規格上「引数 (と関数指示子) を評価する順番」は unspecified なので, 処理系に依存するものの処理系のみで決まることでもありません. 「呼び出しごとに評価順序が変わる」という奇妙なことをする処理系であっても規格には反していません. 本題についていえば convert の 3回の呼び出しをどの順に行っても構わない (厳密には「関数指示子 printf の評価」と「文字列リテラルの評価」もどこかに入るわけだが, この例ではどこに入れても問題ないので最後の printf の呼び出しで行うことにする) ので, 例えば char *p = convert(65, 8); char *q = convert(65, 10); char *r = convert(65, 16); printf("%s = %s = %s\n", p, q, r); と解釈してもいいし char *p = convert(65, 8); char *r = convert(65, 16); char *q = convert(65, 10); printf("%s = %s = %s\n", p, q, r); と解釈しても問題ありません.

kendai912
質問者

お礼

処理系の引数を評価する順番が違う場合は「165」「141」「65」「41」などもあり得るとの指摘ありがとうございます。 実際の動きが分かったので理解出来ました。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>これを「165」「141」「65」「41」にすれば「あり得る」ということに同意いただけますでしょうか>#2. 引数を積む順番…ってところでしょうか。 処理系依存かとは思いますが。 # とりあえず、VC++2010EEでは"101"、"01"、"01"でした。 どっちにしろ…関数内のstaticな変数のアドレスを返す。 ってコトはやった記憶はないですねぇ…。(忘れているだけ…というのはあるかも知れない) 文字列リラテルのアドレス返したことはありますけど。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

もちろん「164」「140」「64」「40」はあり得ませんが, これを「165」「141」「65」「41」にすれば「あり得る」ということに同意いただけますでしょうか>#2.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

おかしいなぁ.... "101" や "01" はともかく, "164" や "140", あるいは "64" や "40" にはなりようもないんだけど.... convert の動作は理解できていますか?

kendai912
質問者

補足

convertの動作は理解出来ています。 "101"などはconvert(65,8)の戻り値だと思うのですが、他の値が一体なんなのか分かりません。。

関連するQ&A