プロが教える店舗&オフィスのセキュリティ対策術

if(--a>0)は
aは毎回-1されるとして負の値になることもあるのでしょうか?
負にしたくないなら、if(a>0) {--a; ~~ } としてください。と言われたのですが、
if(--a>0)とif(a>0) {--a; ~~ } は何が違うのでしょうか?--と>などの比較が同じ( )の中にあるのと--を処理として{ }の中に書くのと何が違うのでしょうか?

A 回答 (5件)

負にしたくない、とのことですが、それはあなたが思っているところとは全く別の問題です。



まず、if(--a>0)の--a>0が偽になるのはaがもともと"1"である時です。aが1の時--aは0となり--a>0は偽となります。
aが1ずつ減っていてすべての処理が終わった後にaが負になっているということはi(--a>0)はすくなくとも2回は偽と判定されているはずです。(もともと1であるときと0であるとき)

勘違いしているのは言うまでもないのですが、それ以外の場所でも間違っているはずです。この処理を行ってる部分のすべてを見せてもらわないと何が間違っているのか確認のしようがありません。
    • good
    • 3

if(--a>0){


・・・・
}



a=a-1
if (a>0){
・・・・
}
と同じ
    • good
    • 0

No2のかたも言われていますが、それを確認するための、試験です。


--------------------------------------
#include <stdio.h>
int main(void)
{
int i;
int a;
a = 3;
for (i=1;i<10;i++){
printf("----- %d回目 --------\n",i);
printf("判定前 a=%d\n",a);
if (--a>0){
printf("判定中 a=%d\n",a);
}
printf("判定後 a=%d\n",a);
}
}
---------------------------------------------
上記を実行すると
----- 1回目 --------
判定前 a=3
判定中 a=2
判定後 a=2
----- 2回目 --------
判定前 a=2
判定中 a=1
判定後 a=1
----- 3回目 --------
判定前 a=1
判定後 a=0
----- 4回目 --------
判定前 a=0
判定後 a=-1
----- 5回目 --------
判定前 a=-1
判定後 a=-2
----- 6回目 --------
判定前 a=-2
判定後 a=-3
----- 7回目 --------
判定前 a=-3
判定後 a=-4
----- 8回目 --------
判定前 a=-4
判定後 a=-5
----- 9回目 --------
判定前 a=-5
判定後 a=-6

のようになります。
つまりif (--a>0)が成立するか否かにかかわらず、無条件に毎回aから1が減算されていることが確認できます。
if (--aa > 0) とか if (a++ > 0)とかのような
if 文の中で、++,--の演算子を使うのはやめたほうが良いです。
私自身、実際の業務でも、if 文の中で、++,--の演算子を使ったケースはありません。(使わなくても何の問題もありません)
これを使うと、ほかの人が、このソースを見たときに、混乱します。
業務で書いたプログラムは、いずれほかの人が、そのプログラムのメンテナンスをすることになります。
その為にも、第三者にもわかりやすいプログラムを書くということは、非常に大切なことです。
    • good
    • 1
この回答へのお礼

わかりました。ありがとうございます。

お礼日時:2019/09/27 23:42

if(--a>0)は、



a = a-1;
if(a>0)
と同じ意味

if(a>0) {--a; ~~ }
と違うのはわかるでしょ?


他の方も仰っていますが、よくわからない内は
--aという書き方はしない方が良いです。
    • good
    • 1

何度説明してもデクリメント演算子の意味が理解できないようなので、「世の中にデクリメント演算子などない」と思って、使わないことにしたほうがいいと思いますよ。

    • good
    • 4

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