2択の文字出力時の場合分け

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SUCH_BEG

2択の文字出力時の場合分け

#1

投稿記事 by SUCH_BEG » 1年前

こんにちは.初めて利用するので失礼があったらすみません.
急ぎではないのでお時間がある方でご存じの方がいらっしゃれば教えてください
C++を勉強中のコード初心者です.
OS : Windows10
コンパイラ:gcc

以下のコードで実行すると

コード:

int main() {

    for (int i = 0; i < 5; i++) {
        cout << "ab"[i==3] << i << endl;
    }

    return 0;

}
次のような出力になることを知りました
a0
a1
a2
b3
a4

そこで,

コード:

"ab"[i==3] 
のような書き方があることを初めて知ったので
使うかどうかは置いといて,知識として知っておきたいなと思ったのですが
このような書き方を紹介しているWebページをご存じの方がいらっしゃったらご教授願いたいです
いろいろ検索してみたのですが,何というキーワードを検索すればいいのかわかりませんで......

アバター
usao
記事: 1887
登録日時: 11年前

Re: 2択の文字出力時の場合分け

#2

投稿記事 by usao » 1年前

コード:

//このpに対して…
const char *p = "ab";

//こうしたら,'a' と 'b' が表示されるよね
std::cout << p[0] << std::endl;
std::cout << p[1] << std::endl;

//---

//っていうのと,まぁ,同じような話で,これでも 'a' と 'b' が表示されるよね.
// "ab" の型は多分,const char[3] だろうから,普通に配列の [0] と [1] を出力しているだけだ.
std::cout << "ab"[0] << std::endl;
std::cout << "ab"[1] << std::endl;
っていうのはOKであろうか?
OKならば,あとは

コード:

[i==3]
の部分がどうなるか? だけが問題になるよね.
配列の index の部分:

コード:

"ab"[ここの中身]
としては,int が必要(ってことで合ってるかな?)なんだけど,そこに書かれているのは
(i==3) で,これは bool になるから,bool から int へ暗黙的な型変換が行われるじゃないかな.

で,これが合ってれば,後は bool から int の変換ってどうなるのか? っていう.
bool → int の変換のルールについては,ググれば見つかるかと思うけど,true は 1 に,false は 0 になるハズ.

---

以上をまとめると,
index の部分は i が 3 のときだけ 1 で,あとは 0 になるわけだから,そのような出力結果になる,と.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 2択の文字出力時の場合分け

#3

投稿記事 by usao » 1年前

> 何というキーワードを検索すればいいのか

っていう点に関しては,例えば…

・"ab" の型については「C++ 文字列リテラル 型」
・配列の index の型については「C++ 配列 index 型」
・bool から int へのキャストについては「C++ bool int キャスト」

…とか,愚直にトライしてみればいけるのではないかな,と.
「仕様」みたいな単語を入れてみても良いかもしれない.

SUCH_BEG

Re: 2択の文字出力時の場合分け

#4

投稿記事 by SUCH_BEG » 1年前

>> usao 様
返信ありがとうございます.感動しました.

まず,早速の返信,そしてわかりやすい説明まことにありがとうございます.

内容について,恥ずかしながら,

コード:

cout << "ab"[0] << endl;
cout << "ab"[1] << endl;
この出力結果が
a
b
となることを存じ上げませんで,これを拝見した瞬間霧が晴れた思いです.
文字列の直後に配列の添え字指定ができるのですね.
普段C++ばかりで,char型の扱いがピンとこないことが多いのですが,今回もその問題だったように思います.
っていうのはOKであろうか?
OKならば,あとは
以降の内容は全く問題なく理解できます.

素早く丁寧なご説明いただき本当にありがとうございました.

返信

“C言語何でも質問掲示板” へ戻る