Rokiのチラ裏

学生による学習のログ

C++を思い出す・・・#2

まずC++とは何なのか。

1970年代に開発されたC言語を機能拡張したもので1980年頃、AT&Tベル研究所Bjarne Stroustrup博士によって原型が生み出され、1988年ANSI/ISO規格により標準化されたプログラミング言語
その後C++03,C++TR1,C++11(0x),C++14(1y)と、コア言語への機能追加や標準ライブラリの拡張が行われながら後継されている。--猫でもわかるC++プログラミング,C++14 Wikipedia参照

...というわけで忘れていそうな所から始めます。細かいところにも無駄に触れます。

エスケープシーケンス

忘れている内容の一つは例えばこういった細かい特殊文字とか...。ただ、あまり使う機会がない気がしている。入出力関連のコアなライブラリーを作るとしたら、もしかしたら使うかもしれない。

#include<iostream>
#include<string>

int main()
{
    struct{
        void operator()(std::string& s,char c){std::cout<<s<<c;}
        void operator()(std::string& s,unsigned int c){std::cout<<s<<c;}
        void operator()(std::string& s,char c,std::string& a){std::cout<<s<<c<<a<<std::endl;}
    }disp;
    std::string a("a"),b("b");

    disp(a,'\n');
    disp(a,'\t',b);
    disp(a,'\b',b);
    disp(a,'\r',b);
    disp(a,'\f',b);
    disp(a,'\'',b);
    disp(a,'\"',b);
    disp(a,'\0',b);
    disp(a,'\\',b);
    disp(a,'\?',b);
    disp(a,'\a',b);
}
$ ./a.out
a
a   b
b
b
a
 b
a'b
a"b
ab
a\b
a?b
ab

各拡張表記の機能がよく分かる。
本題とは関係ないがdisp関数を別途関数として定義するのも全体の趣旨的に違う気がしたので、関数内に構造体を用いて関数内関数のような感じにしてみた。

データ型

基本的な事は覚えているのだが、あまり今まで使わなかった微妙な数値を扱う型があやふやなのでまとめておきたい...と思ったが[マイクロソフトのページ](https://msdn.microsoft.com/ja-jp/library/s3f49ktz.aspx)が分かりやすかった。
(こういう関連で有名なのは、time_t(signed integer)型を使ったUNIX時間が(2^31-1)以上の数値を扱おうとする2038年に、あらゆるCで開発されたモノがオーバーフローして1901年12月に戻っちゃうっていう2038年問題があるよね。どうなることやら。)

Switch構文

C++を書かなくなる少し前に取り組んでいたものが静的分岐(テンプレートによるメタプログラミング)だった事もあってこういった普通の動的分岐のシンタックスを忘れてしまっていたので確認...度々使ったような記憶はないが、昔ゲームを作った時はフラグ関係で使ったかもしれないな。。。

#include<iostream>
#include<vector>
int main()
{
    std::vector<unsigned int> v{1,2,3,4,5,6};

    for(unsigned int i=0; i<v.size(); ++i)
    switch(v[i]){
        case 1:  std::cout<<"a"<<std::endl; break;
        case 2: std::cout<<"b"<<std::endl; break;
        case 3: case 4: case 5: case 6: std::cout<<"c"<<std::endl; break;
        default: std::cout<<"default"<<std::endl;
    }
}
$ ./a.out
a
b
c
c
c
c

continue文

continue文...?そんなのあったっけという感じだったので確認。ループ処理中に、ある特定条件ならば処理を飛ばしてブロック先頭に戻り処理を続行するという時に使うんだったね。

#include<iostream>
#include<iomanip>
int main()
{
    for(unsigned int i=1; i<10; ++i){
        for(unsigned int j=0; j<10; ++j){
            if(i>j)continue;
            std::cout<<i<<"x"<<j<<'='<<std::setw(2)<<i*j<<std::endl;
        }
        std::cout<<"-----"<<std::endl;
    }
}
$ ./a.out
1x1= 1
1x2= 2
1x3= 3
1x4= 4
1x5= 5
1x6= 6
1x7= 7
1x8= 8
1x9= 9
-----
2x2= 4
2x3= 6
2x4= 8
2x5=10
2x6=12
2x7=14
2x8=16
2x9=18
-----
3x3= 9
3x4=12
3x5=15
3x6=18
3x7=21
3x8=24
3x9=27
-----
4x4=16
4x5=20
4x6=24
4x7=28
4x8=32
4x9=36
-----
5x5=25
5x6=30
5x7=35
5x8=40
5x9=45
-----
6x6=36
6x7=42
6x8=48
6x9=54
-----
7x7=49
7x8=56
7x9=63
-----
8x8=64
8x9=72
-----
9x9=81
-----

一度表示した九九の表示を省略したモノ。。。



一旦ここでまた深夜なので止めておきます。なんか、この全く意味もない内容のコードをつらつらと書くの、凄い懐かしい感じがする。