定数式と識別子 解答ページ | Programming Place Plus 新C++編

トップページ新C++編定数式と識別子

このページの概要

このページは、練習問題の解答例や解説のページです。



解答・解説

問題1 (確認★)

次のうち、識別子として使えない名前はどれか選んでください。

  1. __abc
  2. ab__c
  3. abc_
  4. _abc
  5. _ABC
  6. int
  7. INT
  8. a10
  9. 10a
  10. _


識別子として使えない名前は、以下の5つです。

  1. __abc
  2. ab__c
  3. _ABC
  4. int
  5. 10a

識別子に使える名前のルールについて詳しいことは、本編解説を参照してください。

1 の __abc と、2 の ab__c は、予約語の条件「2文字以上の連続する _ が含まれた名前」に該当します。予約語は識別子には使えません。

5 の _ABC は、予約語の条件「先頭が _ で、2文字目が大文字のアルファベットになっている名前」に該当しています。

6 の int は、キーワードの int と同じなので使えません。

9 の 10a は、「先頭に数字は使えない」というルールに違反しています。

問題2 (確認★)

std::cout を使って出力する式、たとえば、std::cout << 3 は定数式ではありません。それはなぜですか。


定数式は、コンパイル時に処理を終えられる式です(本編解説)。

それに対して、出力の処理を行うのは、プログラムを実行してからだからです。

問題3 (基本★★)

長方形の面積を求めるプログラムを、constexpr変数を使って作成してください。辺の長さや単位は自由にして構いません。


たとえば、次のように書けます。

#include <iostream>

int main()
{
    constexpr auto depth = 10;
    constexpr auto width = 5;

    std::cout << depth * width << "\n";
}

実行結果:

50

名前の付け方は色々あると思いますが、ここでは縦の長さを depth、横の長さを width としました。

問題4 (基本★★)

ある同じ重さの物体がいくつか存在するとき、全体の重さを求めるプログラムを、constexpr変数を使って作成してください。重さや単位は自由にして構いません。


たとえば、次のように書けます。

#include <iostream>

int main()
{
    constexpr auto weight = 10;
    constexpr auto number = 5;

    std::cout << weight * number << "\n";
}

実行結果:

50

重さを weight、個数を number で表現しています。

ところで、もし constexpr変数を使わず、リテラルのまま計算したら、次のように書くことになります。

#include <iostream>

int main()
{
    std::cout << 10 * 5 << "\n";
}

実行結果:

50

これは、問題③ の「長方形の面積」の計算式とまったく同じで、「〇〇 × △△」というかたちになっています。

このように、リテラルだけで記述された式では、式の実際の目的が違っても、まったく同じになってしまい見分けが付きません。名前があることによって、意味が明確にできるのです。

【上級】この先のページで学ぶことになりますが、リテラルではなく、式であるとか、ある程度まとまった処理そのものに名前を付けるという、さらに進んだ考え方をして、プログラムを作ることもできます。

問題5 (調査★★★)

識別子の付け方には色々な考え方・ルールがあり、「命名規則」と呼ばれています。命名規則について調べてみてください。


命名規則とは、「プログラミングを行う際にソースコード上の識別子の名称となる文字列を決定するためのルールを定めたもの」1です。

ルールを明確にし、それを守ることで、ソースコードの可読性を高める効果があります。可読性を高めることには、ソースコードの修正のしやすさや、プログラミングのしやすさを向上させたり、誤りに気付きやすくなる効果があります。

命名規則には、プログラミング言語の種類による違い、ソフトウェア開発の現場ごとの違いなどもあって、これといった決定的な考え方・ルールがあるわけではありませんが、Google がまとめたもの2など、有名なものもあります。

たとえば、「会員の人数」をあらわす識別子を付けるにあたって、仮に「number of members」という英語表現を使うとすれば、以下のような選択肢が考えられます。

  1. number_of_members
    • 基本すべて小文字で書き、区切りを _ であらわす
  2. NumberOfMembers
    • 単語の先頭を大文字で書く
  3. numberOfMembers
    • 単語の先頭を大文字で書く。ただし一番先頭だけは小文字で書く
  4. NUMBER_OF_MEMBERS
    • すべて大文字で書き、区切りを _ であらわす

1 はスネークケース、2 はパスカルケース(あるいはアッパーキャメルケース)、3 はキャメルケース(あるいはローワーキャメルケース)と呼ばれる記法です。

スネークは「蛇」、キャメルは「らくだ」のことです。スネークケースは、小文字と _ が並ぶさまが蛇のように見えることから、キャメルケースは単語の先頭だけを大文字にしているさまがラクダのこぶのように見えることから来ています。パスカルは、Pascal というプログラミング言語で使われていたことに由来します。

また、Number を使うと名前が少し長くなるから Num のように省略しよう、という判断も、命名規則の1つと考えられます。このような省略形を命名規則として決めたのなら、プログラム全体で統一しなければなりません。あるときは省略して、ほかのあるときは省略しないということは混乱を招きます(エディタの検索機能で見つからないものがあるなど)。


参考リンク



更新履歴




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