C言語の機能の強化 解答ページ | Programming Place Plus Modern C++編【言語解説】 第3章

トップページModern C++編 C++編](../../index.html) – 第3章

Modern C++編は作りかけで、更新が停止しています。代わりに、C++14 をベースにして、その他の方針についても見直しを行った、新C++編を作成しています。
Modern C++編は削除される予定です。

問題①

問題① 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()
{
    PRINT_LOG("test message");
}

int main()
{
    PRINT_LOG("test message");
    func();
}

実行結果:

main: test message
func: test message

マクロでなく、関数で実装してしまうと、 __func__ がつねにログ出力関数自身の名前に置き換わることになり、うまく働きません。

#include <cstdio>

void printLog(const char* msg)
{
    std::printf("%s: %s\n", __func__, msg);
}

void func()
{
    printLog("test message");
}

int main()
{
    printLog("test message");
    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;
}


参考リンク


更新履歴

’2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

’2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

’2018/1/5 Xcode 8.3.3 を clang 5.0.0 に置き換え。

’2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

’2017/7/6 新規作成。



第3章のメインページへ

Modern C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る