• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:10進⇔16進変換プログラム)

10進⇔16進変換プログラムに関する質問

このQ&Aのポイント
  • C言語を独学している人が、10進⇔16進変換プログラムに関して質問しています。
  • 質問内容は、(1)エラーメッセージについて、(2)コメントの意味についてです。
  • プログラムの説明や詳細な解説は欠落していますが、質問者がミスや理解できていない部分について教えてほしいという要望です。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

for( 式A ; 式B ; 式C) {処理} は 式A ; whil( 式B ) { 処理 式C; } とほぼ同じです。 /* 処理中にcontinueがあると、式Cが評価する/しないの違いが出ます。 */ また、式A,B,Cは省略可能です。 初心者向け解説だと、式Bやif,whileの()の中等を、ただ「条件」とか説明していることもありますが 正確には「式」です。 「Loop」のような変数だけ、「5」といった数値だけ、というのも式です。 「a<b」は「a < b なら1,そうでないなら0」という評価(計算)をする「式」です。(#3に-1とありますが、 間違いです。C言語では1になります。他の言語で-1になるものもありますので、混同したのでしょう) そして、式を評価した値が「真」か「偽」かで処理を分岐します。 C言語では 偽: 0 真: 0以外 となっています。 なので、 for(i=0;i<10;++i) を、より説明的に書くと for(i=0; (i<10) != 0 ; ++i) の意味になります。(!=自体が比較演算子で、0か1を返すのですが) ということで、 > for(loop=1;loop;) は loop=1 ; while(loop){ 処理; /* 式3は無し */ } であり、 while(loop){ は while(loop != 0){ と同義です。 この変数loopのように、状態の真/偽だけを記憶させるような変数を「フラグ」と呼びます。フラグを使う場合、わざわざ0や1と比較しないんで、次のように書くケースが多いです。 if( flag )~ /* 条件成立 : flag !=0 , flag == 1とはあまり書かない*/ if( ! flag )~ /* 条件不成立 : flag ==0 , flag != 1とはあまり書かない*/ whileでなくforを使っているのは、理由はわかりません ・whileよりforの方が効率的なオブジェクトができるコンパイラがある、と聞いたことあったような ・「whieを使わない」というコーディング規則がある、と聞いたことあったような ・とりあえず、「C言語っぽく見える」 > if(scanf("%ld",&data)=!1) /*意味がわかりません。なぜ=!1 ? これはl (Long) の間違えでしょうか?本には1(いち)に見えますが。。。*/ こういうのを理解して修正するときのコツは ・ここで何をしようとしているか考える ・使われている関数のマニュアルを読む です。ただ見た通りに打ち込むだけでなく、それが持つ意味を考えながら入力するのが、上達のコツです。 まず、 =! などという演算子は無いので、 != の間違いか、 「= での代入」 + 「単項演算子!で次の値を否定」です。 ですが =の前が関数です。関数に代入などできません。 「 Lvalue required」→「左辺値 (=の左辺に利用できる、代入可能な値。例えば変数等)が必要」 とは、これを示すエラーです。 よって、 != の間違いだとわかります。 scanfのマニュアルには次のように書いてあると思います 「戻り値: 読み込みに成功した項目数。 失敗時には(略)」 scanf("%ld",&data) では、 %によって読み込む項目は「1」です。 よって、成功すれば、項目数である1が返るはずです。失敗すれば、1でない値が返るはずです。 以上を考えると if(scanf("%ld",&data)!= 1) は 「書式%ldに合致した値をdataに読みこむ → 失敗したら(!=1) 以下の処理を実行する」 となります。 「以下の処理」が%*sによる空読みであることを考えれば、この解釈で間違いは無いでしょう。

yumikoro0324
質問者

お礼

>>式Bやif,whileの()の中等を、ただ「条件」とか説明していることもありますが 正確には「式」です。 C言語では 偽: 0 真: 0以外 となっています。 を理解していませんでした。よく仕事の先輩方が返り値がどーのこーの言っていますがやっと意味がわかりました。 for(loop=1;loop;)の謎も解けました。 ありがとうございます。 >>Lvalue required  の意味も Long Value required !? と解釈してErrorの意味を正しく分かっておらず != と気付くことができませんでした。 >>こういうのを理解して修正するときのコツは ・ここで何をしようとしているか考える ・使われている関数のマニュアルを読む です。ただ見た通りに打ち込むだけでなく、それが持つ意味を考えながら入力するのが、上達のコツです。 ごもっともでございます、ErrorやWarningの意味もわかるように調べて今後気をつけます。 アドバイスありがとうございました。 >>scanfのマニュアルには次のように書いてあると思います 「戻り値: 読み込みに成功した項目数。 失敗時には(略)」 これもお恥ずかしいことに知りませんでした。 これでなぜ lエル ではなく 1いち なのか理解できました。 どうもありがとうございました。 ★ゆみころ★

yumikoro0324
質問者

補足

すみません本文が切れていました。 kmee先生、 ご親切なご回答どうもありがとうございました。 まず私の第一の問題点は、教えて頂くまで >>式Bやif,whileの()の中等を、ただ「条件」とか説明していることもありますが 正確には「式」です。 C言語では 偽: 0 真: 0以外 となっています。 を理解していませんでした。よく仕事の先輩方が返り値がどーのこーの言っていますがやっと意味がわかりました。 for(loop=1;loop;)の謎も解けました。 ありがとうございます。 >>Lvalue required  の意味も Long Value required !? と解釈してErrorの意味を正しく分かっておらず != と気付くことができませんでした。 >>こういうのを理解して修正するときのコツは ・ここで何をしようとしているか考える ・使われている関数のマニュアルを読む です。ただ見た通りに打ち込むだけでなく、それが持つ意味を考えながら入力するのが、上達のコツです。 ごもっともでございます、ErrorやWarningの意味もわかるように調べて今後気をつけます。 アドバイスありがとうございました。 >>scanfのマニュアルには次のように書いてあると思います 「戻り値: 読み込みに成功した項目数。 失敗時には(略)」 これもお恥ずかしいことに知りませんでした。 これでなぜ lエル ではなく 1いち なのか理解できました。 どうもありがとうございました。 ★ゆみころ★

その他の回答 (4)

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

>Wr5先生 ちゃんと仕様書にあたっているワケではないので、それはどうかと………。 >loop!=0ならばわかりますがなぜloopしか書かなくても動くのでしょうか? 変数名のみ書かれている場合は、その変数の中身が0か非0か…の判定を行います。 http://www.grapecity.com/tools/support/powernews/column/clang/021/page01.htm の下の方の「条件式の簡略化」というところですね。 >=! 1 (いち) で正常に動きました。 >なぜいち でよいのでしょうか? != 1(いち) ですよね? なぜ1で判定しているかはscanf()の戻り値を確認して下さい。 scanf("%d", &a) で正常に取得できれば1。 scanf("%d %d", &a, &b) で正常に取得できれば2。 という戻り値になります。 で、今回の場合1以外だったらエラーとして処理する為の判定式ということになります。

yumikoro0324
質問者

お礼

Wr5先生 私にとって教えて下さる方が周りに一人もいないのでここで助けて下さる方は皆さま先生です。 今回もご親切にどうもありがとうございました。 リンク先の!=の説明もよく理解できました。 何度もコメントありがとうございます。 ★ゆみころ★

  • fjk-48
  • ベストアンサー率50% (1/2)
回答No.3

> for(loop=1;loop;) /*意味がわかりません。Loop=1で初期化(これはOK理解できる);Loop ここでループ継続条件なのですが、なぜLoopだけなのかわかりません*/ for文は、  for(初期化;継続条件;再設定) で構成されます。 で、継続条件は、0でなければ継続します。 この場合、loopが1なので(初期化で1になっている)、ずっと継続されます。 再設定は、不要ということのようです。 ちなみに、整数iが用いられ、i<7という評価において、iが7だとしたら、この式は0(すなわち偽)と成り、iが3だとしたらこの式はー1(すなわち真)と成ります。 つまり、評価式(i<=jなど)は、ー1(真),0(偽)の値を持ちます。 さて、 > case 'q': > case 'Q': > loop=0; > break; ここで、loopが0(すなわち偽)にされているので、for文を終了します。 ただ、このプログラムは、for文を使わないで、 loop=1; while(loop){  本文;  終了したいとき、loop=0; } とするのが、【美しい】書き方です。

yumikoro0324
質問者

お礼

fjk-48先生、 ご親切な解説どうもありがとうございました。 美しい書き方も理解出来ました、私はこちらの方が好きです笑 >>for(初期化;継続条件;再設定) で構成されます。 で、継続条件は、0でなければ継続します。 この場合、loopが1なので(初期化で1になっている)、ずっと継続されます。 でわたしの不明点も解決できました。 どうもありがとうございます。 ★ゆみころ★

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

C言語に =! という演算子はありません。 != という演算子はあります。

yumikoro0324
質問者

お礼

asuncion先生 どうもありがとうございました。 ばかなミスをしてしまいました。 無事にプログラムは動きました。 ありがとうございます。 ★ゆみころ★

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

エラーメッセージの行番号がどこにあたるのか…は記載された方がいいかと思われますが…… >for(loop=1;loop;) /*意味がわかりません。Loop=1で初期化(これはOK理解できる);Loop ここでループ継続条件なのですが、なぜLoopだけなのかわかりません*/ 変数loopの中身を評価して、その結果で継続条件とする。 ということに。 loop != 0ってところでしょうか。 >if(scanf("%ld",&data)=!1) /*意味がわかりません。なぜ=!1 ? これはl (Long) の間違えでしょうか?本には1(いち)に見えますが。。。*/ タイプミスにしか見えませんね。 if(scanf("%ld",&data)!=1) ではありませんか? この指定でのscanf()だと、正常に処理できた場合は戻り値として1が返却されます。 書式エラーなどで読み取れなかった場合は1以外になりますから、その判定でしょう。 で… scanf("%ld",&data)=!1 だと、関数に!1を「代入」しようとする。ということになってしまいます。 >if(scanf("%lx",&data)=!1) 32行目…と思われる上記も同様です。 >scanf("%*s");/*意味がわかりません。入力した文字の始めの一文字目のスペースを読み捨てるということでしょうか?*/ マニュアルを参照して下さい…としか。 # scanf()ほとんど使わないので書式についてイマイチ…なので。 http://ja.wikipedia.org/wiki/Scanf#.E6.94.B9.E8.A1.8C.E6.96.87.E5.AD.97.E3.81.AE.E5.8F.96.E3.82.8A.E6.89.B1.E3.81.84 とか http://programmerdarui.blog134.fc2.com/blog-entry-78.html の最後の方(ただし、fflash(stdin)は未定義動作だった筈)とか http://okwave.jp/qa/q6753502.html とか……。 # 入力バッファに残っている非空白を読み捨てる…ってことでしょうかね……。

yumikoro0324
質問者

お礼

Wr5先生 ご親切なご説明どうもありがとうございました。 おバカなのでまだ疑問があります。 (1)すみませんまだ >>変数loopの中身を評価して、その結果で継続条件とする。 ということに。 loop != 0ってところでしょうか。 の意味がわかりません。 loop!=0ならばわかりますがなぜloopしか書かなくても動くのでしょうか? (2)>if(scanf("%ld",&data)=!1) /*意味がわかりません。なぜ=!1 ? これはl (Long) の間違えでしょうか?本には1(いち)に見えますが。。。*/ タイプミスにしか見えませんね。 =! 1 (いち) で正常に動きました。 なぜいち でよいのでしょうか? scanfの改行や空白の読み捨てについては理解できました わかりやすいリンクまで頂き感謝です。 どうもありがとうございました。!! まだ解決できないのでよろしくお願いします。 ★ゆみころ★

関連するQ&A