トップページ – Modern C++編 C++編](../../index.html) – 第3章
問題① bool型や、各種整数型の大きさを調べるプログラムを作成して、自分が使っているコンパイラでの大きさを確認してください。
sizeof を使って調べます。
#include <iostream>
int main()
{
std::cout << "bool: " << sizeof(bool) << "\n"
<< "short: " << sizeof(short) << "\n"
<< "int: " << sizeof(int) << "\n"
<< "long: " << sizeof(long) << "\n"
<< "long long: " << sizeof(long long) << std::endl;
}
実行結果(Visual Studio 2017):
bool: 1
short: 2
int: 4
long: 4
long long: 8
実行結果(clang 5.0.0):
bool: 1
short: 2
int: 4
long: 8
long long: 8
問題② 指定した文字列と、呼び出し位置の関数名を出力するログ出力マクロを作成してください。
関数名は __func__ で得られます。
#include <cstdio>
#define PRINT_LOG(msg) std::printf("%s: %s\n", __func__, msg);
void func()
{
("test message");
PRINT_LOG}
int main()
{
("test message");
PRINT_LOG();
func}
実行結果:
main: test message
func: test message
マクロでなく、関数で実装してしまうと、 __func__ がつねにログ出力関数自身の名前に置き換わることになり、うまく働きません。
#include <cstdio>
void printLog(const char* msg)
{
std::printf("%s: %s\n", __func__, msg);
}
void func()
{
("test message");
printLog}
int main()
{
("test message");
printLog();
func}
実行結果:
printLog: test message
printLog: test message
問題③ 次のプログラムの実行結果を答えてください。
#include <iostream>
int main()
{
int array[] = {0, 1, 2, 3, 4};
for (int v : array) {
*= v;
v }
for (int v : array) {
std::cout << v << std::endl;
}
}
配列の要素それぞれを2乗しているように見えますが、そうはなりません。 実行結果は次のようになります。
実行結果:
0
1
2
3
4
拡張for文で宣言した変数v へは、要素の「コピー」が格納されているため、変数v の値を書き換えても、元の配列の要素は変化しません。
拡張for文を使い、元の配列の要素を書き換えたい場合は、参照(第18章)を使うと良いです。次のように書けば、目的を達せられます。
for (int& v : array) {
*= v;
v }
「VisualC++」という表現を「VisualStudio」に統一。
「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。
Xcode 8.3.3 を clang 5.0.0 に置き換え。
clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |