◎1-----------------------------
int main(void)
{
int a=10,b=20;
while(1){
if(a= =12 && b= =25){
break;
}
++a;
++b;
}
return 0;
}
--------------------------------
◎2-------------------------------------------------------
#include<stdio.h>
#include<ctype.h>
int main(void)
{
char ss[256]="10%%'%shin(no((100!w**a'16&'shi&%$#n~|=~de)&64";
int dt,i=0;
printf("右の文字列には言葉が隠れています: ");
printf("%s\n",ss);
puts("");
printf("1を入力すると言葉が分かります: ");
scanf("%d",&dt);
puts("");
while(dt!=1 && ss[i] !='\0'){
if( !isalnum(ss[i]) ){
ss[i]=' ';
}
++i;
}
printf("%s\n",ss);
puts("");
return 0;
}
------------------------------------------------------------
以上2つのプログラムにおいて疑問があります。
まず◎1のプログラムで、aが12、bが25になるという2つの条件を満たしたら、プログラムを終了させようと思ったのですが、条件を満たしても、ずっとデクリメントし続け終了しません。
「if(a= =12 && b= =25)」の部分を「if(a= =12 || b= =25)」とすれば、aが12になった時点で終了しました。
◎1では「if(a= =12 && b= =25)」という条件が何故適用されないかという疑問があります。
次に、◎2ではdtが1になり、配列ssに格納されている文字列が、'\0'になるという2つの条件を満たしたら終了させようとしたのですが、1を入力すると、「ss[i]!='\0'」の条件が偽にもかかわらず、while文が一度も実行されませんでした。
そこで、1以外を入力すると、while文は実行されましたが、dtの条件が真になる事はないのに、ちゃんと終了しました。
プログラム◎1、◎2について何故こうのようになってしまうのか、教えていただければ嬉しいです。
No.8ベストアンサー
- 回答日時:
◎2に関して。
表示部分等を省いて敷き詰めて書くと、
char ss[256]="10%%'%shin(no((100!w**a'16&'shi&%$#n~|=~de)&64";
int dt,i=0;
scanf("%d",&dt);
while(dt!=1 && ss[i] !='\0'){
if( !isalnum(ss[i]) ){
ss[i]=' ';
}
++i;
}
こういう文なわけですが、
while文はwhile(…)の…の部分が「真」であれば{}内の処理を実行します。
上の…の部分を見てみると、
dt != 1 && ss[i] != '\0'
訳すと、dtが1じゃない かつ ss文字列のi文字目が'\0'じゃない ならば真
&&演算子は、左辺と右辺どちらも真ならば真を返します。
>>1を入力すると、「ss[i]!='\0'」の条件が偽にもかかわらず、while文が一度も実行されませんでした。
1を入力すると、「dtが1じゃない」という条件に対しては「偽」を返します。
よって、どちらも真ならば…という条件を満たさないので、dt != 1 && ss[i] != '\0'は「偽」が返され、while文は{}内の処理を1度も実行しません。
>>「ss[i]!='\0'」の条件が偽にもかかわらず
&&演算子を理解しているなら、「「ss[i]!='\0'」の条件が真にもかかわらず」という勘違いの方がましだと思います。
どちらも真であれば、while文の{}内の処理が実行されます。
>>そこで、1以外を入力すると、while文は実行されましたが、dtの条件が真になる事はないのに、ちゃんと終了しました。
1以外を入力すると、「dtが1じゃない」という条件に対しては「真」を返します。
ちゃんと終了したのは、「ss文字列のi文字目が'\0'じゃない」が途中で「偽」になったからです。
文字列についても一応説明しておくと、
char ss[4]="abc"; とすると、実際には
ss[0] = 'a'
ss[1] = 'b'
ss[2] = 'c'
ss[3] = '\0'
と格納されているので、途中で\0が現れます。
一通り答えてみてから気づきましたが、&&演算子以前に、
>>dtの条件が真になる事はないのに、
が一番の勘違いの原因かな。
dt != 1
訳すと、「dtが1じゃない ならば真」
dtに1以外を入力すると真です。
dtに1を入力すると偽です。
上に書いた内容を理解すれば、「回答番号:No.2へのお礼」での疑問も解決すると思います。
理解できなければ、参考URLを熟読したら理解できると思います。
「真理値表 C言語」でググって2番目に出ました。
参考URL:http://www.asahi-net.or.jp/~AX2S-KMTN/ref/logico …
ご回答ありがとうございます。
どちらかの条件式が偽になれば処理をしないという理解が、完全に曖昧でした。そして「!=」という記述に対して、どちらが真偽であるか混乱してしまいました。
条件式1 条件式2 結果
真 真 真
真 偽 偽
偽 真 偽
偽 偽 偽
論理積演算子は左辺式、右辺式が両方真でない限り処理が行われないという事と、以上の真偽関係をしっかり頭に入れておきます!
No.6
- 回答日時:
>ここにそのまま書き込むと、代入演算子のように見えた
一見そのように見えますが、=の長い短いで判断できます。
なるべく、お手持ちのソースコードに手を加えることなく、
そっくりそのまま載せてくださる方がよいです。
No.5
- 回答日時:
◎2
dtの値はループの中で変化しません。
したがって、while文の条件にする必要がありません。
if文で1回だけ判断すればじゅうぶんです。
確かにdtは常に一定なので、条件式としては意味はないですね。。
でも今回、dtを条件式に入れた事によって何故このような処理が行われたのか、疑問に思いました。
No.3
- 回答日時:
◎1だけ回答します。
if(a= =12 && b= =25){
break;
}
の意味は、
aが12で かつ bが25の場合、breakが実行されます。
従って、aが12になったとき、bは22なので、breakは実行されません。
>>「if(a= =12 && b= =25)」の部分を「if(a= =12 || b= =25)」とすれば、aが12になった時点で終了しました。
if(a= =12 || b= =25){
break;
}
の意味は、aが12 または bが25 の場合、breakが実行されます。
従って、aが12になった時、bは何でもよいので(b=22ですが)
breakが実行されます。
&& の意味と || の意味をきちんと理解することが大切です。
ご回答ありがとうございます。
aが12になった時点で、aはデクリメントされないという、馬鹿な考えをしていました。恥ずかしい限りです。。
詳しくご説明ありがとうございました。
後、&&の意味と||の意味をきちんと理解しておきます!
No.2
- 回答日時:
◎2
dt!=1
ですからdtが1ではないという条件を求めていますが?
「dtの条件が真になる事はないのに」というのは
たんなる勘違いでは?
ご回答ありがとうございます。
まずdt側の終了条件をscanf入力によりあらかじめ満たしておいて、その後、デクリメントされた後、ss[i]側が'\0'になり、2つの終了条件を満たし、終了させるという事をさせようと思ったのですが、何かやはり勘違いがありますかね?
後、1以外を入力した場合、「1以外の場合はループを続ける」ということで、ループが終わらないと思ったのですが、終わってしまいました。
以上についてご回答いただければ嬉しいです。
No.1
- 回答日時:
> ◎1では「if(a= =12 && b= =25)」という条件が
> 何故適用されないかという疑問があります。
a==12の時はb==22でありb==25の時にはa==15なので、
a==12 && b==25という条件は永遠に有り得ません。
集合はやらなかった世代か弱いですか?
あまり考える所ではないのですが、センスなのかな?
2はパスです。
ご回答ありがとうございます。
>a==12の時はb==22でありb==25の時にはa==15なので、
>a==12 && b==25という条件は永遠に有り得ません。
そうですよね♪
何か恥ずかしいです(;^_^)
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
scanf関数を用いての加減乗除%...
-
構文エラー";"が型の前にあり...
-
基礎だと思いますが、教えてく...
-
プログラミングで二番目に大き...
-
和を求める問題
-
if文
-
SIGALRMでプロセス終了
-
c言語 プログラム
-
c言語for文
-
配列を関数に渡す方法
-
C言語。どうしてコンパイルでき...
-
プログラミングに関して
-
計算結果がlong型以上になる場...
-
C言語で、条件をつけて総和を求...
-
並べ替えのプログラム
-
行列をべき乗させるプログラム
-
1年単利金利 0.2% の A銀行と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
10進数からN進数に変換するプロ...
-
getcの改行判定
-
C言語で電卓を作成する。
-
プログラミングで二番目に大き...
-
配列を使って魔方陣
-
C言語プログラムが理解できなくて…
-
計算結果がlong型以上になる場...
-
scanfが実行されません
-
素因数分解のプログラムを作成...
-
プログラム
-
while文を使った問題なのですが...
-
C言語階乗の総和を求める
-
C言語 エラー表示 break の位...
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
-
初心者です。for文、if文を使っ...
おすすめ情報