次の C コードに問題があります。
int y = 0, h = 640, ih = 640;
h = y + h - max(0, (y + h) - ih);
h を 640 に設定する必要がありますが、代わりに 0 に設定されています。
ここで実行されていることがわかります: http://ideone.com/zBZSsr
この奇妙な動作について何か考えはありますか? 私は何か間違ったことをしていますか?
次の C コードに問題があります。
int y = 0, h = 640, ih = 640;
h = y + h - max(0, (y + h) - ih);
h を 640 に設定する必要がありますが、代わりに 0 に設定されています。
ここで実行されていることがわかります: http://ideone.com/zBZSsr
この奇妙な動作について何か考えはありますか? 私は何か間違ったことをしていますか?
リンクした例の max マクロには、余分な括弧のペアが必要です。
あなたが持っている:
#define max(x, y) ((x) > (y)) ? (x) : (y)
あなたの例では、これは次のように展開されます。
h = y + h - ((0) > ((y+h)-ih)) ? (0) : ((y+h)-ih);
演算子の優先順位は、左側のすべてが三項演算子の条件式に組み込まれることを意味すると思います。bool から int への暗黙的な変換があり、その結果、常に true の状態になるため、単に 0 である true ブランチを取得します。
マクロは次のようにする必要があります。
#define max(x, y) (((x) > (y)) ? (x) : (y))
あなたのコードは前処理されます
h = y + h - ((0) > ((y + h) - ih)) ? (0) : ((y + h) - ih);
問題は、+ と - が ?: 演算子よりも優先されることです。
#define max(x, y) ((x) > ((y)) ? (x) : (y))
定義の周りに () を追加すると、計算が正しくなります。