A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
ANSI Cでは「二つの前後するシーケンスポイント間の変更前の値は、格納する値を決定する為にだけ使用する」ことを許していますので、c=a++ -b; は、c=a-b; a=a+1; と同じ動作です。
No.3
- 回答日時:
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++;
のような状況のことをいいます。
No.2
- 回答日時:
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;
}
なんてやってしまうとアウトだったりします.
No.1
- 回答日時:
++i
i++
はそれぞれ計算のタイミングが異なります
c = a++ - b;
↓
c = a - b;
a++;
と解釈されると考えればよいです
ただし
c = a++ + a;
なんていうのはどういう結果になるのかは不明ですので、注意
(言語規定でも決められていない)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 会社・職場 産休前の仕事 2 2022/07/31 12:51
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- 数学 放物線y=a(x-a)(x-b)について、頂点の座標を求めなさい。ただし、a≠0とし、a,bは実数の 6 2023/03/21 00:26
- 数学 WolfarmAlpha計算機 計算結果がおかしい 2 2022/07/02 15:42
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- 数学 (2)の答えは、a+2=aの二乗を計算して、a=2になるらしいのですが、②の式−xの二乗にaを代入し 3 2022/04/04 10:53
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
EXCEL/VBA 変数の値をクリップ...
-
C言語 列挙型(enum型)変数について
-
整数xxxが大き過ぎますというエ...
-
「%」を使って、偶数か奇数かを...
-
テキストボックスの値を変数に...
-
i++と++i ってどう違うのですか?
-
[VBS]変数を定数に変換する方法...
-
ExcelのVBAでをA列に第0〜19項...
-
Accessコンボボックスにレコー...
-
processing エラーで、 "cannot...
-
変数にオフセットが付いている...
-
構造体からレコードセットへの代入
-
C言語 アロー演算子について質...
-
プログラミングで変数と関数の...
-
切り上げ
-
python の 連鎖代入の文法
-
Variant型で宣言してるのにEmpt...
-
無名関数のメリットがよくわか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
EXCEL/VBA 変数の値をクリップ...
-
C言語 列挙型(enum型)変数について
-
テキストボックスの値を変数に...
-
Variant型で宣言してるのにEmpt...
-
[VBS]変数を定数に変換する方法...
-
python の 連鎖代入の文法
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
-
processing エラーで、 "cannot...
-
整数xxxが大き過ぎますというエ...
-
プログラミングで変数と関数の...
-
構造体からレコードセットへの代入
-
コマンドプロンプト バッチ|結...
-
stdpicture型の変数に、、
-
無名関数のメリットがよくわか...
-
i++と++i ってどう違うのですか?
-
DataTableの値を変数に代入したい
-
Accessコンボボックスにレコー...
-
VBA 1行で複数の代入を行った...
おすすめ情報