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という値が出力される理由がわかりません。
優先順位とか、比較とか調べましたが未だによくわかりません。
A 回答 (9件)
- 最新から表示
- 回答順に表示
No.9
- 回答日時:
--a> 0
と、書けば「aが正の時にだけaを-1する」と思っているのでしょうか?
どこにもそういう選択する記述はないので、常にaは-1されますよ。
例えば、サブルーチンfooがあるとして、foo() > 0 と書けば「foo()が正の時だけfoo()を呼ぶ」と思いますか?
「aが正の時にだけaを-1する」という処理は、if(a>0) {--a;} と書くか、あるいは、 a>0 && --a です。
No.8
- 回答日時:
じゃあもうひとつ
if(a<=500 && --a>0) {
処理A
}
処理B
の意味は
①a<=500を計算せよ
②もし①が真なら③へ、偽なら⑦へ
③aをデクリメントせよ
④a>0を計算せよ
⑤④が真なら⑥へ、偽なら⑦へ
⑥処理Aを実行せよ。
⑦処理Bを実行せよ
③~⑤は①が真でないと実行されないことに注意。
&&の左側が真の時のみ&&の右側を評価(計算の実行)することを
短絡評価(ショートサ-キット評価)といいます。
また③が、①の前ではなく②と④の間で実行されることは
Cの規格を相当読み込まないとわからない。
#私はよく読んでないので確信が無い(^-^;
大抵の人は判断できないので
ショートサ-キットが有るようなややこしい式の中に
代入やインクリメント、デクリメントや関数呼び出しなど副作用を伴なう
ものを混ぜない方が良い。
No.6
- 回答日時:
>多分規格で決まっていると思うけど
ざっと規格を洗ってみたけど AN05 さんの
動きになるっぽい(副作用は&&を越えない)。
ただ副作用に関しては規格の変遷やCとC++の違い
とかが複雑過ぎて追いきれませんでした(^-^;
良い子は手を出しちゃいけません。
No.5
- 回答日時:
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
No.4
- 回答日時:
>if(50<=a&&--a>0)とした場合、
>右は真偽関わらず-1されると言われたのですが本当ですか。
aが49以下なら式が偽なのはあたり前だが
aが49以下の時プレデクリメントが動くかは自信ない(^-^;
というか忘れた。
多分規格で決まっていると思うけど
プレデクリメントとショートサーキット評価の組み合わせなんて
闇の世界に手を出してはいけない(^-^;
No.2
- 回答日時:
> aが-1の場合もif(50<=a&&--a>0)が真として働く理由がわかりません。
偽ですよ。
a = -1;
if(50<=a&&--a>0) {
printf("TRUE\n");
}else{
printf("FALSE\n");
}
を実行してみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- 英語 "beside"と比較級の共起の可否について 5 2022/11/15 09:51
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- 統計学 t検定を繰り返してはいけない理由について教えて下さい。 2 2022/05/15 12:37
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- 統計学 新製品が売れているかの統計解析 3 2023/04/27 21:46
- 経済学 この文って間違ってないですか? 間違いがある場合は教えて欲しいです。 各国の経済的な豊かさを測るとき 2 2022/07/21 01:09
- Access(アクセス) Accessテキストボックス内に2つのフィールドの値を比較して大きい方の値を表示させる方法 1 2022/09/09 10:50
- Google Maps 同じ住所か比較 3 2023/04/29 19:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メルカリのメルカードで買い物...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
お家デートをしててハグを長い...
-
【Excel】特定の文字を含むセル...
-
取り消し線が入った文字を削除...
-
新婚半年でセックスレスになっ...
-
セックスレスの既婚女性は自慰...
-
VBA SaveChanges 上書きされない
-
VBAのユーザーフォームのテキストボックス...
-
緊急です。 知り合いから50kgの...
-
読み方教えてください。
-
緊急です。 知り合いから50kgの...
-
エクセル95のマクロで自動的に...
-
月度は何て読みますか?
-
EXCEL VBA----ユーザーフォーム...
-
VBAでセルに値が入力されるまで...
-
Webアプリや業務アプリのデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
UMLでの例外処理
-
月度は何て読みますか?
-
switch の範囲指定
-
VBの質問#if 0 then ってどう...
-
セルの値が0はクリアするマクロ
-
VB.NET Excelを読み込んでDataT...
-
Do~Loopした回数をカウントしたい
-
Loadイベント中にほかのイベン...
-
Select Case文でこのようなこと...
-
findは動くがfindnextがマクロ...
-
緊急です。 知り合いから50kgの...
-
リョウ・・・量?料?
-
理不尽、行き場のないイライラ...
おすすめ情報
すいません。少し誤りがあり、正しくはこちらです。
if (a <= 500 && --a> 0)において
aが0として、500以下なので左の項は真ですが、左の項は‐1されていき0より小さい場合はなので偽となりますが、
これはaが0の時は真と偽であり結果的には&&により偽となるため、aの値はでないあるいは0のまらまと考えていたのですが、-1と結果がでました。
なぜでしょうか?
これは<やーーなどの演算子の優先順位とかによって結果が偽であっても値が出てくるのでしょうか。
&&の文がどのように処理されるか理解できていませんでした。
そのように決まっていると覚えます。
どうもありがとうございます。