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

if (a <= 500 && --a> 0)において
aが0として、500以下なので左の項は真ですが、左の項は‐1されていき0より小さい場合はなので偽となりますが、
これはaが0の時は真と偽であり結果的には&&により偽となるため、aの値はでないあるいは0のまらまと考えていたのですが、-1と結果がでました。
なぜでしょうか?
これは<やーーなどの演算子の優先順位とかによって結果が偽であっても値が出てくるのでしょうか。

A 回答 (4件)

真偽の判定で偽であっても、その文は実行されます。

ただそれだけ。
演算子の優先順位とかは関係ありません。後置ディクリメントであるa-->0であってもaが0の場合でも偽の判定が出てもディクリメントされて-1になります。

実行されないのはifの後ろにある文。ifの直後の()中はルールに従い実行される。

それともう一つ突っ込み。
--a>0
これはaが1の場合でも偽になります。ディクリメントが評価の前に行われますのでa:1→0としてからa>0が判定されます。
    • good
    • 0

>これはaが0の時は真と偽であり結果的には&&により偽となるため


&&の解釈、違います。この説明は&であり&&ではありませんよ。

&&の場合は、
「これはaが0の時は a <= 500 が真となり、&&により、 --a> 0 が評価され結果的に偽になるため」
です。
なお --a> 0 を評価するときに、aの値は0から−1に変えられます。

<おまけ> aが600のときは、a <= 500 が偽となり、&&により  --a> 0 は評価されることなく、式全体は偽になります。--a> 0 は評価されないので、aは600のままです。
    • good
    • 1

--a> 0 は、これが成立しようがしまいがaから1引かれます。


if (a <= 500 && --a> 0){
  処理
}

上記は
if (a <= 500){
  --a;     ・・・・・①
  if(a > 0){
    処理・・・・・・・・②
  }
}
と等価です。
aが0のとき①が実行されます。②は実行されません。しかし①が実行されるので-1になります。

if (a <= 500 && --a> 0){
  処理
}

上記は

if (a <= 500){
  --a;     ・・・・・①
  if(a > 0){
    処理・・・・・・・・②
  }
}

と等価です。

aが0のとき①が実行されます。②は実行されません。しかし①が実行されるので-1になります。


   条件①  条件②
if (a <= 500 && --a> 0)
は、
条件①が真の場合のみ次の条件②評価されます。
この時、条件②が成立しようがしまいが、--aがまず、実行されます。
(--変数又は++変数 を前置演算子といいますが、前置演算子は、評価に先立ち実行されます)

つまり
a--;
a > 0
の順に実行したのと同じです。
    • good
    • 0

> --a



で、aは0から-1にデクリメントされます。


--a > 0
(a-1) > 0
をごっちゃにしているのでは。
    • good
    • 1

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