6W1H

仕組みをわかりたい

3項演算子について

こんにちは

目には青葉山ほとどぎす初鰹の季節となります.
お忙しいかと存じますが,日記をお書きになりますよう何卒よろしくお願いします.
TwitterやらFaceBookやらインターネット,多くの人の目に触れる方法では駄目です.
社会性フィルターとプライドフィルターで先ほどのような文になります.
備忘録というかそんな感じの意味でそういう日記みたいなのはつけてみるのが良いかもしれません.
何かがわからないとか,誰かがムカついた,ぶち*したいとか…デトックス効果みたいなのがあるかもしれません.
ネットに書いたりすると人格を疑われたりします.
あとこんなご時世なのであまり過激なことを書くと早朝にポリスメンが訪ねてくるかもしれません.知りませんが.
構わない人はネットでやればいいと思います.
ちなみに筆者は日記は書いていません.面倒くさいからです.

この記事について

筆者がTwitterを眺めてるとFizzBuzz問題をやっている人がいました.

FizzBuzz問題が何かはググればわかります.
すごく簡単な問題です.
筆者もなんとなくやりたくなってきてしまったので,やることにしました.
ですがやるからには,特にSNSなんかで晒すからには,普通のことをするのは楽しくないと思ったので,いろいろ考えてたら3項演算子でやったら面白そうだと閃きました.
更にいろいろ考えたら3項演算子に3項演算子を入れられるんじゃないかと閃いたので,書いてみたら本当に動いたのでこの記事を書きました.
皆さんにとっては当たり前のことだと思いますが,僕にとっては画期的というかそんな感じだったのでこの記事を書きました. なのでこの記事には簡単な3項演算子についてと3項演算子の入れ子について書いてあります.
それと筆者が書き慣れている言語がC++なのでこの記事はC++での3項演算子について書いてあります.

3項演算子

構文はこんな感じです.

<条件> ? (条件が真の時に返す値) : (条件が偽の時に返す値)

個人的な意見ですが,あんまり可読性がよろしくないのでまったく使ったことがありません.

2つの値を比べて大きい方を返すプログラムを書いてみます.

3項演算子を使わずに書いた場合

#include <iostream>

int max(int a, int b){
    if(a > b){
        return a;
    }else{
        return b;
    }
}

int main(){

    std::cout << max(10, 20) << std::endl;

    return 0;
}

3項演算子を使って書いた場合

#include <iostream>

int max(int a, int b){
    return (a > b) ? (a) : (b);

    // 括弧が無くても動きます.
    // return a > b ? a : b;
}

int main(){

    std::cout << max(10, 20) << std::endl;

    return 0;
}

3項演算子の入れ子

とりあえずコードを見てみてください. 3項演算子で解いたFizzBuzz問題です.

#include <iostream>
#include <string>

int main()
{
    for(int i = 1;i < 100;i++){
        std::cout << ((i%3 == 0)? ((i%5 == 0)? "FizzBuzz" : "Fizz") : ((i%5 == 0)? "Buzz" : std::to_string(i))) << std::endl;
    }

    return 0;
}

このコードはここで動かすことができます.
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

3項演算子を入れ子にするシーンが思いつかなかったのでこういう説明なってしまいました.
では,ちょっとずつ噛み砕きましょう.

まずは3の倍数かどうかを調べます.

    (i%3 == 0) ?

3の倍数であれば5の倍数かどうかを調べます.
3の倍数かつ5の倍数,つまりFizzBuzzであるかを調べます.
3の倍数かつ5の倍数であればFizzBuzzを返し,そうでなければFizzを返します.

    (i%3 == 0) ? ( (i%5 == 0) ? ("FizzBuzz") : ("Fizz") )

3の倍数でなくても5の倍数かどうかを調べます.
5の倍数,つまりBuzzであるかを調べます.そうでなければルールに従って普通に数字を返します.
(プログラムでは文字列に直すため数字をstring型に変換しています.)

    (i%3 == 0) ? ( (i%5 == 0) ? ("FizzBuzz") : ("Fizz") ) : ( (i%5 == 0) ? ("Buzz") : (i) )

まあこんなものができても業務に役立つとかないと思います.
パズルとかなんというか娯楽プログラミングみたいな感じで.

参考にしたページ

Fizz Buzz - Wikipedia
C,C++言語での三項演算子の正しい(?)使い方 - j○kerfin○たんの□グ