令和元年秋期午後問8

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
lilさん  
(No.1)
https://www.fe-siken.com/kakomon/01_aki/pm08.html
設問3のプログラム3(GenerateBitMaskRegex)の解釈について質問です。
このプログラムの初期化後の処理は2つの解釈ができそうだなと思いました。
C言語に書き換えてみました。

解釈1
----------------------------------------------
for(i = 0 ; i<=OriginalPatLen ; i++){
    if (Pat[i] == "["){
        Mode = 1;
        PatLen = PatLen + 1;
    } else {
        if (Pat[i] == "]"){
            Mode = 0;
        } else {
            if (Mode == 0){
                PatLen = PatLen + 1;
            }
            Maskの処理(省略)
        }
    }
}
----------------------------------------------

解釈2
----------------------------------------------
for(i = 0 ; i<=OriginalPatLen ; i++){
    if (Pat[i] == "["){
        Mode = 1;
        PatLen = PatLen + 1;
    } else if (Pat[i] == "]"){
        Mode = 0;
        if (Mode == 0){
            PatLen = PatLen + 1;
        }
        Maskの処理(省略)
    }
}
----------------------------------------------

問題の趣旨や解説を読んで判断すると解釈1になりますが、この疑似言語プログラムを見ると解釈2のようにも見えます。解釈2は問題の意図とは違う動きですが。
疑似言語の記述形式にelse ifの定義はないので、逆に解釈2のように疑似言語で書くにはどのように書くのか知りたいです。
2021.05.22 13:20
GinSanaさん 
FE シルバーマイスター
(No.2)
この投稿は投稿者により削除されました。(2021.05.22 15:48)
2021.05.22 15:48
GinSanaさん 
FE シルバーマイスター
(No.3)
なんというか、図で説明がしづらいので、
https://www.fe-siken.com/kakomon/22_haru/pm08.html
の図を参考にすると、if分岐は横棒入りの矢印ですよね。
で、elseのとこ(横棒の下)にまた矢印を足して、同じことをかきます。
2021.05.22 15:48
lilさん  
(No.4)
ご返答ありがとうございます。
https://www.fe-siken.com/kakomon/01_aki/pm08.html
この問題においても、横棒入りの矢印の横棒の下に横棒入りの矢印を入れてるのではないでしょうか。
2021.05.22 18:28
GinSanaさん 
FE シルバーマイスター
(No.5)
そうですね。elseの中にまたifを書くから、一般的にいう else ifなんですよ。
というより、ほんとはCの文法の仕様(ISO/IEC 9899:TC2)には if ... else if ... という文法事項は書かれていないんです。if ( [expression] ) [statement] else [statement]だけ。
else if が使える理由は if ( [expression] ) [statement] else [statement] の全体が一つの [statement] であるので、else の後の [statement] に代入できてしまうからです。

というのも、else ifというのは、こんな風に作られるからです。
C言語由来の多くの言語はブレース(波括弧 = {})の省略が可能であり、
if (A) {
    print(A);
} else {
    if (B) {
        print(B);
    }
}
以下のように記述することが可能になります。
if (A)
    print(A);
else
    if (B)
        print(B);
C言語系列の多くの言語はフリーフォーマットを採用しているため、else文とif文を同一の行に記述しても問題はないわけです。
すると上記のコードは、以下の様な詰めた書き方にもできますね。
if (A)
    print(A);
else if (B)
    print(B);
結果としてelse ifという記述が実現されたわけです。
だから、
横棒入りの矢印の横棒の下に横棒入りの矢印を入れてる
でいいんです。
2021.05.22 19:24
GinSanaさん 
FE シルバーマイスター
(No.6)
まあ、こういう説明すると、たまにガチガチフォーマットのpython君はelifもってんじゃんとか言われたりしますが、
そりゃあグイド・ヴァンロッサムが不便だろうからと定義しただけであって、言語のメタとして考えればやはりifかelseか
しかないんですね。
2021.05.22 19:55
lilさん  
(No.7)
詳しくありがとうございます!
もとはif elseだったんですねー。勉強になりました。
2021.05.22 22:07

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop