- ベストアンサー
C言語の文法の意味とは?
- C言語の文法について詳しく教えてください。
- ポインタや計算方法に関する疑問を解説してください。
- どのような結果が得られるのか知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
「こんなコードをコメントなしで書いてきたら問答無用で却下する」というのは私も#4と同じです。 が、それはそれとして解読し得る範囲で。 回答1: 普通はこういう定数値(一般にマジックナンバーと呼ばれます)はその意味がわかるようにdefineしておくのが常識です。 なんらかのデータフォーマットにそった計算方法だろうとは思いますが、この数字だけでは何をやっているのかを読み取ることはできません。 結果は、もちろんbuff[5*16+5+(16*21+6)]のアドレスが得られますよ。 それが何を意味するかは、上記の理由によりさっぱりわかりませんが。 回答2: tp-4のtpというのは質問1で求めたアドレスですね。 その4個前、tpはcharのポインタですから4バイト分前のアドレスを求め、そのアドレスをunsigned intのポインタと見做した上で参照外しを行う、つまりtpの直前4バイト分をunsigned int型と解釈した数値がstrbsに出力されます。 tp-65のほうはさっぱりわかりませんね。65の手がかりになるものが全くないので。
その他の回答 (4)
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
分からん。 ちなみに、こんなプログラムを部下や上司が出してきても認めん。 汚すぎる。。。。
お礼
回答になっていないようなぁ??? そこは目をつぶって上げて下さいm(_)m
質問1:1つ1つの数字についての意味はわかりませんが、このように書くメリットは'5*16+5+(16*21+6)'に意味があるからです。 これをあらかじめ計算結果の数字を書いてしまうと、何がなんだかわからないものになってしまいます。 そして、一番重要なことは、この計算はコンパイル時に結果が求められるため、実行時の処理速度には影響しないと言うことです。 つまり、電卓などであらかじめ計算した答えを書くのと、なんら変わりがないと言うことです。 もちろん、可読性は全然違います。 質問2:char *tp だとよくわかりませんが、たとえば型が long *tp だとしたら tp+1 とした場合には計算時にはtpの値に4が加算されます。 つまり、tp[1]と考えればいいでしょう。 つまり、+1だからと言って必ず1が加算される訳ではなく、その変数の型によって違って来るのです。 これも4や65に、何らかの意味があるのでしょう。
お礼
そうなんですよね!!意味があると思うのですが、C言語の特有の書き方だと勘違いしてしまいました。作成した方に連絡を取って仕様を聞いてみようと考えています。ありがとうございました。
- neko1963
- ベストアンサー率49% (127/258)
質問1については、5*16+5+(16*21+6)=427 で buff先頭から427バイト目(?)アドレスをポインタに入れているようですが、 buffの中にどのような内容がどのようなレイアウトで入っているのかわからなければ "5*16+5+(16*21+6)"の意味はわかりません。 プログラムを書いた人に尋ねなければ、他の人はわからないのではないでしょうか。 質問2 tp-4 はポインタtpの4バイト前(?)でしょうから、tpの4バイト前(?)からunsigned intにキャストして10進数8桁として strbに格納する? いずれにしても、 buffの中にどのような内容がどのようなレイアウトで入っているのかわからなければ、どうしようもありません。 プログラムを作った方にお尋ねになった方が良いと思います。
お礼
そうですね!!作成した方に聞いてみたほうが早そうですね!!ありがとうございます!!
- mnabe
- ベストアンサー率33% (427/1283)
そりゃぁ載っていないでしょ。 可読性の問題だけでしょうからね。 tp は、バッファ領域を作成しているのだと思うのですが、その領域を計算式で求めているだけですからね。どんなプログラムで利用しているのか解りませんが、 16バイトが21個合ってそれに6バイト足した物と5バイトが16個ある物に5バイト足した物を合算しているって意味なんでしょうね。 実際に、そのプログラムを動かしてみるのが一番の様な気がしますけど、それが出来ない理由でもなるのですか? tpは、ポインタを参照しているアドレスを保持しているので、そこからのアドレス値での減算を行って値を持ってくるって事をしているのでしょう。
お礼
参考資料にこれしかなくて・・・・C言語をメイクやコンパイルする環境がないので何かまでは分からないので解読してました。規則性があるのかと思ったのですが、ただのバイトの加算減算処理なのですね。ありがとうございます。
お礼
回答ありがとうございます。仕様みたいなので確認したいと思います。ありがとうございました。