topazの遊び場

いろいろやってみる

そろそろC++やるぞパート22 演算子 「( )」「++」「--」「[typeid」

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

  • 今回は演算子( ),++,--,typeidを行っていきます。

関数呼び出し演算子 ()

構文

postfix-expression:
 postfix-expression ( argument-expression-list opt )

引数は、式のコンマ区切りの一覧であるargument-expression-listからなります。argument-expression-listは空の場合もあります。

引数式は、不定の順序で評価されます。

とは書いてありますが、こちらのコードで100回ループしても引数順に呼び出されました。

int Write(string text, int val)
{
    cout << text << endl;
    return val;
}

void ReceiveFunc(int a, int b, int c)
{
    cout << a << ":" << b << ":" << c << endl;
}

int main()
{
    for (int i = 0; i < 100; i++)
    {
        ReceiveFunc(Write("one", 1), Write("two", 2), Write("three", 3));
    }
}
  • 値を返す関数
int AAA()
{
    int a = 123;
    return a;
}
  • ポインタを返す関数
int *BBB()
{
    int *b = new int(123);
    return b;
}
  • 参照を返す関数
int &CCC()
{
    int *c = new int(123);
    int &d = *c;
    return d;
}

後置 インクリメント/デクリメント 演算子 ++, --

構文

postfix-expression ++
postfix-expression --

C++には前置インクリメントと後置インクリメントが共に実装されています。

後置インクリメントは、オペランドの値が適切な型の 1 単位分、増加させます。

int型やlong型はインクリメントすると1増えます。

int i = 12;
i++;
cout << i << endl;
long l = 34;
l++;
cout << l << endl;

Output

13
35

ポインタや配列の時に増え方が、1ではなく1単位分になります。

int *a = new int[10];

for (int i = 0; i < 10; i++)
{
    a[i] = 3 * i;
}

int *ai = &a[5];

cout << ai << endl;
cout << *ai << endl;
ai++;
cout << ai << endl;
cout << *ai << endl;

Output

0x121e06904
15
0x121e06908
18

intポインタの場合は1単位分(4)インクメントされていることがわかります。

これがshortになると、1単位分の2がインクリメントされるようになります。

short *a = new short[10];

for (int i = 0; i < 10; i++)
{
    a[i] = 100 + i;
}

short *ai = &a[5];

cout << ai << endl;
cout << *ai << endl;
ai++;
cout << ai << endl;
cout << *ai << endl;

Output

0x121e0685a
105
0x121e0685c
106

typeid演算子 typeid

構文

typeid(type-id)
typeid(expression)

typeidの結果はconst type_info&です。

int a = 123;
cout << typeid(a).name() << endl;
string s = "Hello";
cout << typeid(s).name() << endl;
char c = 'a';
cout << typeid(c).name() << endl;
HogeClass hogeClass;
cout << typeid(hogeClass).name() << endl;

Output

i
NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
c
9HogeClass

このように、直接の型名ではなく、C++側の出力しやすい形で出力されているように思います。

typeidデバッグ出力用に使うのかなと思います。

参考リスト

感想

typeidはあまり使わないかな、という感じです。 関数呼び出し演算子やインクメント/デクリメントも他の言語と同じような一般的な使い方しかしなさそうです。

次回も引き続き、演算子を行います。