アプリ版:「スタンプのみでお礼する」機能のリリースについて

a=5, y=3とします。
c=a++ -b の計算結果はどうなるのでしょうか??

aがa+=1される前にcに代入されるようなのですが
cに5が代入されるのか、それとも
cに5-3=2が代入されたあとに
a=a+1が計算されるのでしょうか??

結果的にc=2になるでしょうか?

A 回答 (4件)

ANSI Cでは「二つの前後するシーケンスポイント間の変更前の値は、格納する値を決定する為にだけ使用する」ことを許していますので、c=a++ -b; は、c=a-b; a=a+1; と同じ動作です。

    • good
    • 0

a, b, cの型にもよりますが、普通は、



(1) c = a - b; ++a;
(2) c = a; c -= b; ++a;
(3) c = a; ++a; c -= b;

のどれかになることが多いかと思います。
ちなみに、

c = a++ + a;

とした場合、オペランドの評価順序が不定ですので、結果がこうなると言い切れなくなります(未定義の動作ではありません)。
上記の(1)または(2)のときと、(3)のときで結果が変わる点に注目してください。

未定義の動作になるのは、副作用完了点に達する前に同じオブジェクトを複数回更新した場合です。
具体的には、

a = a++;

のような状況のことをいいます。
    • good
    • 0

a++ は a の値をそのまま返し, ++a は a+1 の値を返します. そして, どちらも「その文を実行している途中のどこか」で a の値を 1 だけ増やします.


だから, 実装上
c = a - b; a=a+1;
としてもいいし
a=a+1; c = (a-1)-b;
としてもかまいません (理論上はほかのタイミングもあり得ますが, この場合にはどちらかのタイミングと全く同じ動作になります). 今の場合, どちらであってもその文の処理が終わったときには c = 2 となります.
上の 2つの例を見ればわかりますが, 「b」を評価するときには a の値が確定しません. そのため
c = a++ + a;
のような文を書いてしまうと「未定義動作」となり, 規格ではいかなる結果も保証しません.
もちろんこんなわかりやすいことは普通はありえません. 実際には外部変数や関数呼び出しがからんできて, たとえば
#include <stdio.h>
int a;
int return_a(void)
{
return a;
}
int main(void)
{
a=5;
printf("%d\n", a++ + return_a());
return 0;
}
なんてやってしまうとアウトだったりします.
    • good
    • 0

++i


i++
はそれぞれ計算のタイミングが異なります

c = a++ - b;

c = a - b;
a++;
と解釈されると考えればよいです
ただし
c = a++ + a;
なんていうのはどういう結果になるのかは不明ですので、注意
(言語規定でも決められていない)
    • good
    • 0

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