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

aが-1の場合もif(50<=a&&--a>0)が真として働く理由がわかりません。
例えば、aが50として毎回-1されるとして、
if(50<=a&&--a>0)とした場合、右は真偽関わらず-1されると言われたのですが本当ですか。
左よりaが500以下なら真の時、右は--が付いているため引き算され0と比較して、比較されるだけで-1にはなるというだけなのでしょうか?

50以下であるため、マイナスの値も真となってしまう、しかし、aが-1となった場合>0の比較はおかしいため偽となるため、-1という値が出力される理由がわかりません。
優先順位とか、比較とか調べましたが未だによくわかりません。

質問者からの補足コメント

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

      補足日時:2019/09/28 18:41
  • &&の文がどのように処理されるか理解できていませんでした。
    そのように決まっていると覚えます。
    どうもありがとうございます。

      補足日時:2019/09/28 21:25

A 回答 (9件)

ソフトによって式の書き方が違います。

何をお使いですか?
    • good
    • 0

> aが-1の場合もif(50<=a&&--a>0)が真として働く理由がわかりません。



偽ですよ。
a = -1;
if(50<=a&&--a>0) {
printf("TRUE\n");
}else{
printf("FALSE\n");
}
を実行してみてください。
    • good
    • 0

この質問のどこに


-1という値が出力される
ようなところがある?

ひょっとして, 自分を超能力者だと思い込んでいるのか?
    • good
    • 5

>if(50<=a&&--a>0)とした場合、


>右は真偽関わらず-1されると言われたのですが本当ですか。

aが49以下なら式が偽なのはあたり前だが
aが49以下の時プレデクリメントが動くかは自信ない(^-^;
というか忘れた。

多分規格で決まっていると思うけど
プレデクリメントとショートサーキット評価の組み合わせなんて
闇の世界に手を出してはいけない(^-^;
    • good
    • 0

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


if(50<=a){
 --a;
 if(a>0){
  処理
 }
}
と同じです。
aから1引かれるのは、aが50以上の場合のみです。aが49以下の場合は、aは変化しません。
以下のプログラムで確認できます。
-------------------------------------
#include <stdio.h>
int main(void)
{
int i;
int a;
a = 52;
for (i=1;i<10;i++){
printf("----- %d回目 --------\n",i);
printf("判定前 a=%d\n",a);
if (50 <= a && --a>0){
printf("判定真 a=%d\n",a);
}
printf("判定後 a=%d\n",a);
}
}
----------------------------------------
実行結果(判定真が上記の”処理”に該当します。4回目以降はaの値は変わりません)
----- 1回目 --------
判定前 a=52
判定真 a=51
判定後 a=51
----- 2回目 --------
判定前 a=51
判定真 a=50
判定後 a=50
----- 3回目 --------
判定前 a=50
判定真 a=49
判定後 a=49
----- 4回目 --------
判定前 a=49
判定後 a=49
----- 5回目 --------
判定前 a=49
判定後 a=49
----- 6回目 --------
判定前 a=49
判定後 a=49
----- 7回目 --------
判定前 a=49
判定後 a=49
----- 8回目 --------
判定前 a=49
判定後 a=49
----- 9回目 --------
判定前 a=49
判定後 a=49
    • good
    • 0

>多分規格で決まっていると思うけど


ざっと規格を洗ってみたけど AN05 さんの
動きになるっぽい(副作用は&&を越えない)。
ただ副作用に関しては規格の変遷やCとC++の違い
とかが複雑過ぎて追いきれませんでした(^-^;

良い子は手を出しちゃいけません。
    • good
    • 1

基本的なことがわかってないと思うけど



--a>0
という式の真偽と
aがデクリメントされることとは無関係。

この「式」の意味は
・式を計算する「前に」、aをデクリメントせよ。
・a>0を計算せよ。

ここまでが式の意味で、ifが関わってくるのはこの後で
計算結果から分岐先が決まる。その時
デクリメントはもうとっくに終わっている。
    • good
    • 5
この回答へのお礼

わかりやすいです。
なるほど、
計算して変数の値が出てから{ }の中を実行するかの真偽(分岐)がでるのですね。
なので、

お礼日時:2019/09/28 20:10

じゃあもうひとつ


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

の意味は
①a<=500を計算せよ
②もし①が真なら③へ、偽なら⑦へ
③aをデクリメントせよ
④a>0を計算せよ
⑤④が真なら⑥へ、偽なら⑦へ
⑥処理Aを実行せよ。
⑦処理Bを実行せよ

③~⑤は①が真でないと実行されないことに注意。
&&の左側が真の時のみ&&の右側を評価(計算の実行)することを
短絡評価(ショートサ-キット評価)といいます。


また③が、①の前ではなく②と④の間で実行されることは
Cの規格を相当読み込まないとわからない。
#私はよく読んでないので確信が無い(^-^;

大抵の人は判断できないので
ショートサ-キットが有るようなややこしい式の中に
代入やインクリメント、デクリメントや関数呼び出しなど副作用を伴なう
ものを混ぜない方が良い。
    • good
    • 2
この回答へのお礼

なるほど、左の項が真であったため、デクリメントされたのですね。右の項の真偽は関係ないとして

お礼日時:2019/09/28 21:18

--a> 0


と、書けば「aが正の時にだけaを-1する」と思っているのでしょうか?
どこにもそういう選択する記述はないので、常にaは-1されますよ。
例えば、サブルーチンfooがあるとして、foo() > 0 と書けば「foo()が正の時だけfoo()を呼ぶ」と思いますか?

「aが正の時にだけaを-1する」という処理は、if(a>0) {--a;} と書くか、あるいは、 a>0 && --a です。
    • good
    • 1

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