HOME»基本情報技術者試験掲示板»令和元年秋期午後問9
投稿する

令和元年秋期午後問9 [2280]

 C言語初心者さん(No.1) 
https://www.fe-siken.com/kakomon/01_aki/pm09.html

下記のプログラムで、elseの下にtblH[chr]とtblL[chr]がありますが、
iやnやtなどのif条件(0x20 <= chr ) &&(chr <= 0x7E)を満たしているものに対しても、
else以下の文(tblH[chr]とtblL[chr])が実行されているのがわかりませんでした。

ご回答可能でしたら、なぜ実行されているのかお教え願います。
else以降に制御できる文は1つだけで、
else以降に複数の文を書くのは間違いと教科書に書かれておりました。
下記のプログラムは書き方として正しいのでしょうか。

[プログラム]
for(chr = 0x00; chr <= 0xFF; chr ++){
   if((0x20 <= chr ) &&(chr <= 0x7E))
      tblC[chr] = chr;
   else
      tblC[chr] =MASKCHR;
   tblH[chr] = hex[chr>>4];
   tblL[chr] = hex[ 設問1回答a ];

2020.04.26 00:10
メタルさん(No.2) 
FE ブロンズマイスター

>>else以降に複数の文を書くのは間違いと教科書に書かれておりました

厳密には、else以降に複数の文を書きたいときは、ブロック{}でくくるのが正解です。
2020.04.26 07:37
メタルさん(No.3) 
FE ブロンズマイスター
間違っていたらごめんなさい。

if文は二つやり方があって、
一つ目は
if(省略)
処理1
else
処理2
処理3

二つ目は
if(省略)
{
処理1
}else{
処理2
}
処理3

一つ目のif文だと、if直後の一行目の処理1がif文の条件にあった時のみ実行され、else直後の一行目の処理2が、
ifの条件に合わなかった時のみ実行される処理とされます。
処理3は二行目以降なのでif文と関係のない、
無条件で実行される処理になります。
これと全く同じ処理を{}つきで表記すると二つ目のif文になります。
ブロックを省略すると直後の行の処理だけif文の条件分岐に含まれるのです。
つまり、処理3はいかなる条件でも常に実行されます。
2020.04.26 07:54
メタルさん(No.4) 
FE ブロンズマイスター
>>下記のプログラムは書き方として正しいのでしょうか。

コンパイラとしては問題ありません。
しかし私としては、人間側が混乱する恐れがある為、
ブロックで括ったほうが良いと思います。
2020.04.26 07:59
メタルさん(No.5) 
FE ブロンズマイスター
あくまでC言語の仕様を理解しているか、テストのためのコードなのでしょう。
2020.04.26 08:03
C言語初心者さん(No.6) 
メタルさん
C言語初心者です。

ご回答誠にありがとうございます。
大変参考になりました。

ご指摘の通り、ブロックで括られていたら納得できるのですが、
回答いただいた1つ目のif文の使い方は知りませんでした。
今後は、1つ目の書き方を踏まえて問題に取り組みます。

本当にありがとうございました。
2020.04.26 12:24
メタルさん(No.7) 
FE ブロンズマイスター
ご理解いただけて何よりです。
どういたしまして。
2020.04.26 13:03
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop