> C Assignment Operators > An assignment operation assigns the value of the right-hand operand to the storage location named by the left-hand operand. Therefore, the left-hand operand of an assignment operation must be a modifiable l-value. After the assignment, an assignment expression has the value of the left operand but is not an l-va
バグ持ちから解放されるのか・・・ (スコア:1)
#性懲りもなく初物買いしたりして。
バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:0)
Re: (スコア:1, 興味深い)
Re: (スコア:3, 参考になる)
インテル本家のチップはBCD演算補正命令の動作にバグがあり、
NECは当初そのバグを修正した互換チップであるμPD8080Aを発売したのですが、
ソフトウェアの互換性が無くなるというのが不評で、
結局バグも再現したインテル完全互換のμPD8080AFを発売する羽目になりました…
Re:バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:0)
int a;
volatile int b;
void test(){ a=b=0;}
で、aが0に初期化されない。コンパイラーのバグだ!って
bに代入した結果が0になるとは限らないし、その結果をaに代入するからというと、
変な仕様、バグを仕様にしたんだなって、また、理解の仕方が代入は分けないとバグになるっと
そして、他人のプログラムの問題ない代入でも指摘して、代入わけたほうがいいよ
かなり、略してますが、こんな人がいました。
Re:バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:1)
volatile int b;
void test(){ a=b=0;}
で、aが0に初期化されない。コンパイラーのバグだ!って
それとも、test()を実行しているのにaが0になっていないという事なのでしょうか?
後者なのでしたら、私も変数aが0になっていない理由がわからないです…
もしくは単に、最適化の影響を勘違いしただけなのでは?と思うのですが…
値を代入した直後にブレークして、変数をウォッチした時にaが0と表示されないという事なら充分あり得ますね。
(変数aが一時的にレジスタに割り当てられている為。変数bはvolatileが宣言されているので最適化が無効になるので常に正しい値が表示される)
もうちょっとなんとかなりまへんか…
Re:バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:1)
bに0をstoreした後、再度bからloadされて、それからaにstoreされるので、
storeとloadの間にbが書き換えられる可能性があるのでは。
Re:バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:1)
ですが、その場合はvolatile宣言の有無や、a=b=0の式はあまり関係ないと思うのですが…
クリティカルセクションを使わないでそんな事したらプログラムそのものがバグるだけかと。
それにしても、このプログラムって前提条件がよくわかりませんねぇ。
#1455232さんの言うI/Oポートの可能性もあり得ますし。
アセンブラ的には、
mov [b],0 ; ポートに出力
mov ax,[b] ; ポートから読み出し
mov [a],ax ; 読み出した値をaに代入
となるかと。
もうちょっとなんとかなりまへんか…
Re:バグのないCPUなんて、バグのないプログラムのようなものだ (スコア:1)
複数スレッドから共有されている変数でも、割り込みでも、I/Oでも、
まあ、前提条件がよく分からんのは確かですが、組み込み系のプログラムに関わった事のある人なら常識の範囲内。いずれにしても、何らかの要因でこのプログラムの外から書き換えられる可能性のある変数であると、
わざわざvolatileで宣言しているわけで、
にもかかわらず書き換えられない事を期待していたという矛盾が、嗤うべきところなのではないかと。
Re: (スコア:0)
# 初期化されないって、そりゃtest()実行してませんしねぇ。
## 違う
Re: (スコア:0)
あれ? そうなの?
Re: (スコア:0)
それでも、b = 0の式としての値は0なので、aには0が代入されるはずですが。
Re: (スコア:0)
こんなコードになりました。
b = 0; a = b;
ということなので、gcc の実装を信じる限りは「b =
Re: (スコア:0)
http://msdn.microsoft.com/ja-jp/library/474dd6e2(VS.80).aspx [microsoft.com]
> C Assignment Operators
> An assignment operation assigns the value of the right-hand operand to the storage location named by the left-hand operand. Therefore, the left-hand operand of an assignment operation must be a modifiable l-value. After the assignment, an assignment expression has the value of the left operand but is not an l-va