そろそろ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
はデバッグ出力用に使うのかなと思います。
参考リスト
- 関数呼び出し演算子: () | Microsoft Learn
- typeid 演算子 | Microsoft Learn
- 後置インクリメント演算子と後置デクリメント演算子: ++ および -- | Microsoft Learn
感想
typeidはあまり使わないかな、という感じです。 関数呼び出し演算子やインクメント/デクリメントも他の言語と同じような一般的な使い方しかしなさそうです。
次回も引き続き、演算子を行います。