• ベストアンサー

プログラムがわからないのですが

とあるC言語の本を読んだのですが、 さっぱり分かりませんでした。 例えば、こんな感じです。 「つぎのプログラムを実行し終わったときの各変数の値を 求めよ。」との事です。 以下、このようになります。 void main() { int i,j,k,l; float p; double x; i=9.2+7.3; j=13/4*4.0; i/=j%5;-(1) p=(--i +j++)/5.0; x=j-p*2; k=i==10llj<=20;-(2) l=i(p/2<x-2);-(3) } 上記のプログラムですが、i=7,j=13,k=1(真), lは0(偽)、pは3.8、xは5.4となります。 j,p,xについてはわかるのですが、 i=7,k=1(真)lは0(偽)について、何故そうなるのか わかりません。 しかし、私なりに考えてみました。 まず、iについては、 j=13ということから、 i/=13%5; i=i/13%5; %というのは、余りのことです。 よって、13÷5=2は、余りは3 iは、整数型だから、 16.5でなく、小数点は、切り捨てて i=16 i=16/3 i=5になるのではないでしょうか。 k=i==10llj<=20;-(2) l=i(p/2<x-2);-(3) の部分ですが、恐らく k=1(真)、lはO(偽)がわからないから、 (2)、(3)がわからないと思います。 (2)は、本で調べた結果、 kとiは、10また、jは、20以下で、 (3)の条件が成り立つのでしょうか。 もし宜しければ、何故、このようなこの答えが 成立するか教えて頂けないでしょうか。 それでは、宜しくお願いいたします。

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 なんだか・・・・この問題・・・引っかけの山ですね。  優先順位に、型の昇格に・・・まぁ、よりどみどりな問題ですわ。(じつに嫌らしい=^・・;=)  まず、6行目。これが終わった時点で、iは16です。  次、7行目。この時点で、jは、12です。気をつけてください。13では「ありません」。理由は、13/4が整数演算なので、答えが3となることにあります。3*4は12です。  次、8行目。この時点で、iは8です。ここの部分のあなたの考え方はあってます。ただし、jを勘違いしているので、計算が狂っているだけです。  次、9行目。この行は、i、j、pのすべての変数の数値が変わります。順に行きましょう。まず、iですが、このデクリメント演算子が適用されますから、この行が終わったときには、iは1減って、7。jは、インクリメントして、13です。さて、iは、前置で、jは後置ですからpを求める式は、「(7+12)/5.0」で3.8となります。  次の2行は、単純に計算するだけです。が、最後の行は、私にはわかりません。i(・・・)という演算がなんなのか・・・。理解できません。

noname#110303
質問者

お礼

何卒、プログラムミスがあり申し訳ございません。 丁寧な説明は、とても参考になりました。 最後になりますが、わざわざ回答してくださって 誠に有難うございました。 これからもよろしくお願いいたします。

noname#110303
質問者

補足

l=i(p/2<x-2);-(3) でなく、 l=!(p/2<x-2);-(3) です。 申し訳ございません。 もし宜しければ、アドバイスお願いいたします。

その他の回答 (1)

  • symgt
  • ベストアンサー率56% (68/120)
回答No.2

C/C++ではある条件が成立する場合、真(1)を返し、 条件が成立しない場合、偽(0)を返します。 (2)は「iが10またはjが20以下」という条件が成立しているのでkに真(1)が代入されます。 k = (i == 10 || j <= 20);と書いたほうがわかりやすいと思います。 (3)は「p/2がx-2より小さい」という条件が成立しているので「(p/2<x-2)」は真(1)なのですが 否定演算子(!)によりlには偽(0)が代入されます。

noname#110303
質問者

お礼

C言語って、PASCALと違って、 文法がややこしいですね。 1歩1歩成長していきたいです。 ご回答有難うございました。 これからもよろしくお願いいたします。

関連するQ&A