- 締切済み
a=a+1;mysub(a);とmysub(a+1);の違いは。
こんにちは。 MikroCというコンパイラで C言語のプログラムを組んでいます。 ここで、 ある関数に引数を渡すのですが、 a=Adc_Read(0); a=a+10; Delay_Cyc(a); では、期待した動作を しないのですが、 a=Adc_Read(0); Delay_Cyc(a+10); では、期待した動作となります。 また、 a=Adc_Read(0)+10; Delay_Cyc(a); でも、期待した動作となります。 まったく同じのように 思うのですが、 何が違うのでしょうか。 コンパイラが、a=a+xという 書き方を許していない ということでしょうか。 何か分かる人がいましたら、 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kkk1024
- ベストアンサー率33% (42/127)
こんばんは。 質問者様の期待する動作がどのようなものか分かりませんがタイトルにある「a=a+1;mysub(a);とmysub(a+1);」は少なくとも違う動きになりますね。 1つめの「a=a+1;mysub(a);」は (1).a=a+1; ここで"a"は加算されて"a"に代入されるため、"a"自体が変化 (2).mysub(a); 変化した"a"を関数"mysub"に引き渡し 2つめの「mysub(a+1);」は (1).<mysub実行前の>a+1 "a+1"自体は評価されるが"a"自体は変化しない (2).mysub(a+1); "a+1"の結果が関数"mysub"に引き渡される 前者は"a"の値が変化しますが、後者は"a"の値は変化しません。 質問本文にある"Delay_Cyc"関数に渡す値は変化しませんが、その後の"a"は変化しますよ。 質問者様が指しているのが本文の"a"の結果であれば、 1つめと3つめは同一の結果、2つめは他より10少ない結果です。 ただ、質問者様が期待している動作は2つめと3つめなので、少なくとも"a"の結果を期待しているのではないのですよね? 質問本文に間違いがなければですが… 他には"Adc_Read"関数実行、"a+10"の評価、"Delay_Cyc"関数実行のタイミングは若干異なるのかな? バイナリレベルの想像がつかないし、どんな実行方式かも分からないので何とも言えませんが。 MikroCというコンパイラがどのようなものか分かりませんので、実行コードに落ちた段階でどうなるかは分かりません。 後は質問者様はデバッグ中だと思いますが、その注視する範囲が間違っているとか、問題を見誤っているとか? 参考になれば幸いです。
- eroermine
- ベストアンサー率18% (83/444)
次でタイミング取ってるようなので変えたら駄目だね。 オプチマイザーも使えなそうだね。
- SilverThaw
- ベストアンサー率32% (260/806)
>期待した動作をしないのですが、 と書かれても、回答者にはどのように動作していないのかは判断するすべがありません。 Adc_Read(); Delay_Cyc(); に関連するソース(呼び出し元も含めて)をすべて開示してください。 最低でも上記二つの関数のソースの内容と >a=a+10; のaの宣言文は必須です。 >コンパイラが、a=a+xという書き方を許していないということでしょうか。 ならば、普通はコンパイル時にワーニングもしくはエラーとなります。
期待した動作というのが、この部分だけでは判断できません。 もう少し他の部分も見せてもらわないと何とも言えませんね。