![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
C/C++におけるPostfix incrementとPrefix incrementの質問です.僕は今まで現在の行のプロセスが始まる前に計算されるのが++aで現在の行のプロセスが終わってから計算されるのがa++だと思っていたのですが違うようです.例えば以下のコードを書いてみました.
bool print(int counter)
{
cout << counter << endl;
return true;
}
int main()
{
int counter = 0;
if(print(counter) && counter++ > 0 && print(counter)){
cout << counter << endl;
}
return 0;
}
この場合出力は
0
です.最初のprintに渡される0が出力されて,counter++ > 0の段階ではcounterは0として比較されるようです.この条件が偽なので2回めのprintは呼ばれないですし,ifの中身も呼ばれないです.
次にcounterの初期値を1にします.
bool print(int counter)
{
cout << counter << endl;
return true;
}
int main()
{
int counter =1;
if(print(counter) && counter++ > 0 && print(counter)){
cout << counter << endl;
}
return 0;
}
この場合の出力は
1
2
2
です.最初のprintに渡されるのは1で,counter++ > 0は1>0で真.2個めのprintには2が渡されて,ifの中身のcounterも2ということだと思います.この2つの実験を合わせると
counter++ > 0の処理の時はまだインクリメントされていないが,
counter++ > 0 && print(counter)の処理の時にはprint(counter)のcounterはインクリメント済みということになると思います.同じ行での処理なので僕の今までの理解では説明できません.C言語のオペレーターの処理順序で説明できるかと思ったのですがそうではなさそうです.http://www.difranco.net/compsci/C_Operator_Prece …
こういう処理がどういう順番で行われるかの細かい定義が知りたいです.今回の例だけでなくインクリメントの処理全体を理解したいです.リンクなどがあればそういったものでも構いません.このサイトでもインクリメントに関する質問はされていますが,今回の例は説明できない気がします(https://oshiete.goo.ne.jp/qa/4753046.html)(あるいは僕が理解できていないのでしょうか?)
解答お持ちしております.
No.3ベストアンサー
- 回答日時:
・前置インクリメントは、インクリメントされた値が使われる
x= ++a ;
を等価なプログラムにするなら
a=a+1 ;
a_temp = a;
x=a_temp;
または
a_temp = a+1;
x=a_temp;
a=a+1 ;
どちらになるかは、規格では決まっていない。
・後置インクリメントは、インクリメントされる前の値が使われる
x= a ++ ;
を等価なプログラムにするなら
a_temp = a;
x=a_temp;
a=a+1 ;
または
a_temp = a;
a=a+1 ;
x=a_temp;
どちらになるかは、規格では決まっていない。
・ && は、左から順番に評価される。
左が「偽」なら、右は評価されない。(このとき 値0 ( 偽) となる)
if( ex1 && ex2 ) { doSomething ; }
を等価なプログラムに変えるなら次のような感じ
if (ex1) {f=true;} else {f=false;}
if ( f ) {
if (ex2) {f=true;} else {f=false;}
}
if (f) { doSomething;}
・変数の値が変化するような「副作用」は「副作用完了点」までに完了することになっている。
https://oshiete.goo.ne.jp/qa/4132534.html
おそらく、あなたが「現在の行のプロセスが始まる前/終わってから」と言っているのは、この「副作用完了点」を誤解した(あるいは理解が不十分な)ものでしょう。
counter++ > 0 && print(counter)
は次のようになります。
・ && は 左から順番に評価されます
・ 先に評価される counter++ > 0 は、インクリメント前のcounterの値で > 0 の比較が行われます。
・ && は 副作用完了点 なので、右の print(counter)を評価する前に(左が偽の場合は評価せずに) counter=counter+1 は完了しています。
ありがとうございます.
言われた通り副作用(side effect), 副作用完了点(sequence point)について調べなおしてみました.完全に誤解していたようです.
関数呼び出し演算子の(),&&,||,?,コンマはsequence pointであることから,counterのインクリメントは&&より先に完了している,ということで説明ができるということになると思います.ありがとうございました.
No.2
- 回答日時:
> So in the statement y = x * z++; the current value of z is used to evaluate the expression
> (i.e., z++ evaluates to z)
> and z only incremented after all else is done.
ご質問の場合
print(counter) && counter++ > 0 && print(counter) の構造は
expression && expression && expressionとなるので
(counter++ > 0) は、
(counter > 0)を評価して、その後counterがインクリメントされる
となるのではないでしょうか。
ありがとうございます.確かにexpression(式)を使った説明でも順序は規定済みのようですね.
JIS X 3010-1993(ISO/IEC 9899/1990)
構文で示されているか(35)、又は(関数呼出し演算子()、&&、||、?:及びコンマ演算子に対して)後で規定する場合を除いて、部分式の評価順序及び副作用が生じる順序は未規定とする。
つまり&&で挟まれているとその前後で副作用が生じないことは規定済み.この説明も僕が求めていた答えなのですが,No.3さんの説明の方が分かりやすく今後の人の参考にもなるかと思うのでベストアンサーはNo.3さんに渡します.ありがとうございました.
No.1
- 回答日時:
>プロセスが始まる前に計算されるのが++aで現在の行のプロセスが終わってから計算されるのがa++だと思っていたのですが違うようです
「現在の行」の意味が不明ですが、
a=1のとき
a++ は 1
++a は 2
ですよ。
>同じ行での処理なので僕の今までの理解では説明できません.
どこが理解できないのでしょうか?
評価されるときのcounterの値を順番に見ていけば
if(print(counter) 0 1
&& counter++ > 0 0 1
&& print(counter)){ x 2
cout << counter << endl; x 2
になりませんか?
ありがとうございます.
現在の行は”;”で区切られるまでの表現の意でした.
今回は>は++よりも先に処理されていますが,&&は++の後に処理されていますよね.これがどこで定義されているかが知りたかったんです.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- 英語 提示分の"with"の使い方等について 1 2022/08/23 10:40
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- その他(プログラミング・Web制作) 【Python初学者】以下コードについて教えていただきたいです 4 2023/04/19 13:01
- 英語 英語についての質問です。 We have learned a lot about when and 1 2022/11/21 17:58
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- その他(プログラミング・Web制作) どうしてもエラーが解決できません。 1 2022/07/23 04:32
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
【至急!!!】python言語で本を見...
-
python3について。
-
qq!!の意味を教えてください。
-
数値かどうかの判定方法
-
I2C接続のLCDディスプレイを使う
-
シェルスクリプト+perl
-
PythonのJanomeを使って品詞の...
-
perでメールが送信出来ない場合...
-
perlで以下の記述の意味につい...
-
PythonでUTF8の文字列をリスト...
-
pythonのmap、結果の利用は1度...
-
一行に複数の演算子がある場合...
-
整数の表現について
-
Pythonでプログラミング プログ...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
子windowsからsubmit()後にclos...
-
VBA他のブックから値のみ貼付す...
-
テーブル内でドロップダウンメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
python3について。
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
数値かどうかの判定方法
-
シェルスクリプトで、空白(ス...
-
UWSCのSELECT文の記述方法
-
関数「exists」と「defined」の...
-
文字のカラーとフォントの指定...
-
pythonの*
-
チェックボックスのCGIへの値の...
-
perでメールが送信出来ない場合...
-
変数の中は文字列か数値か調べ...
-
swift 文字コードから文字に変...
-
c言語 16進数の2進数への変換
-
switch文のエラーについて
-
DBIがうんともすんとも言いませ...
-
pythonを使ったプログラミング...
-
int(input("○○"))の使い方
-
Python3
おすすめ情報