準・究極の選択

(キャスト)変数++; … 一
((キャスト)変数)++; … 二
(キャスト)(変数++); … 三

一と等しいのは、二と三のどっちですか?

A 回答 (4件)

#1です。

失礼しました。#2の方の言うとおりです。
後置++の性質をすっかり忘れていました。

a = 10;
b = a++;
とすると、aは11、bは10となります。

たとえば
s = 10;
t = (LONG)s++;
とすると、
sは11で、tは10(LONG型)となります。

「++されてからキャストされることになります。」
というのは間違いでした。
お詫びいたします。
    • good
    • 0
この回答へのお礼

おや?
最初にいただいた回答も
「++されてからキャストされることになります。」
と思いましたよ。
でも、ありがとうございます。

お礼日時:2003/03/23 08:49

この質問は「演算の順位」よりも「左辺値と右辺値」が重要です。



((LONG)s)は変数ではなく、値であることに注意してください。
((LONG)s)++はコンパイルエラーです。
((LONG)s)は領域を持たない為左辺値、なりえません。
++演算子が要求するオペランドは「左辺値」です。

よって、(LONG)s++の構文は(LONG)(s++)と解釈せざるを得ません。

以下、質問の本質とは外れます。
C言語において、規格上決定しているのは「演算子の結合順位」であって、「演算子の評価順位」は処理系依存です。

ほとんどの教則本は「結合順位」と「評価順位」を混同しています。

int i = 0, a[10] ;
a[i++] = i ;
この処理は処理系によって違う結果を出す可能性があります。

> ++されてからキャストされることになります。
++とキャストは独立です。
b=0;
a=(long)b++;
この場合、bの値(=0)を評価し
・0をlongにキャスト
・bを++
の2つの処理が行われますが、2つの処理の順番は決まっていません。
    • good
    • 0
この回答へのお礼

「結合順位」と「評価順位」の違いがまだよく分からないんですが、今は三と同じ
ということが分かっただけでもよかったです。
ありがとうございました。

お礼日時:2003/03/23 09:27

三と同じです。


ただし、後置++と後置--は結合の優先順位はキャスト演算子よりも高いですが、実行されるのは他の演算子よりも後です。
    • good
    • 0
この回答へのお礼

他の演算子よりも後である++や--よりも、キャストはさらに優先度が低いと覚えておきます。
ありがとうございました。

お礼日時:2003/03/23 08:45

増分演算子++とキャスト演算子(LONG)のどちらかが優先されるかという事でしたら、


演算子の表を見ればすぐ出ます。
増分演算子の勝ちです。
++されてからキャストされることになります。
(参考文献『ANSI C/C++辞典』平林雅英著 共立出版)
    • good
    • 0
この回答へのお礼

三と等しいものだったんですね。
参考文献のご紹介もありがとうございます。

お礼日時:2003/03/23 08:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報