

別の方が書いたものを写させていただきました。なので、他のところには問題はないと思います。私なりに調べてみたところ今の C++
のバージョンではバージョンでは使えないとのことでしたが、`constexpr`
を使う方法、あるいは今のバージョンで同じ役割があるものを教えていただければ幸いです。

なお、MacBook Air 上で VSCode を使用しています。

[code]

    int main(){
        //平均値を求めるプログラム
    
        //計算する元となる数値を NUMBERS_SIZE だけ用意
        static constexper int NUMBERS_SIZE = 10;
        int numbers[NUMBERS_SIZE] = { 1, 2, 3, 5, 5, 2, 10, 100, 50, 33};
    
        //人間が確認できるように numbers[] を画面に出力
        for (int i = 0; i < NUMBERS_SIZE; ++i) {
            printf("%d, ", numbers[i]);
        }
        printf("\b\b \n");
    
        // ここから平均値を求める計算
        // 平均値を格納するための変数 average を宣言
        double average = 0.0;
    
        // まずは数値達の合計を求める
        for (int i = 0; i < NUMBERS_SIZE; ++i) {
            average += numbers [i];
        }
    
        // 次に数値達の数で割る
        average /= NUMBERS_SIZE
    
        // 答えが求まったはずなので
        // 人間が確認できるように average を画面に出力
        printf("平均値は %d です\n", average);
        
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2022-05-12T18:02:54.643
88791
2022-05-13T18:32:15.577
2022-05-13T18:32:15.577
3060
52592
question
c++ xcode macos
constexpr を試したところエラーが出ました


幾つか間違いがあるようです。

  * `#include <stdio.h>`が先頭にない
  * `constexpr`を`constexper`と記述し、`e`が余分
  * `average /= NUMBERS_SIZE`行に行末の`;`がない
  * `printf("平均値は %d です\n", average);`は`%d`ではなく`%f`

以上を修正したコードが、下記になります

[code]

    #include <stdio.h>
    
    int main(){
        //平均値を求めるプログラム
    
        //計算する元となる数値を NUMBERS_SIZE だけ用意
        static constexpr int NUMBERS_SIZE = 10;
        int numbers[NUMBERS_SIZE] = { 1, 2, 3, 5, 5, 2, 10, 100, 50, 33};
    
        //人間が確認できるように numbers[] を画面に出力
        for (int i = 0; i < NUMBERS_SIZE; ++i) {
            printf("%d, ", numbers[i]);
        }
        printf("\b\b \n");
    
        // ここから平均値を求める計算
        // 平均値を格納するための変数 average を宣言
        double average = 0.0;
    
        // まずは数値達の合計を求める
        for (int i = 0; i < NUMBERS_SIZE; ++i) {
            average += numbers [i];
        }
    
        // 次に数値達の数で割る
        average /= NUMBERS_SIZE;
    
        // 答えが求まったはずなので
        // 人間が確認できるように average を画面に出力
        printf("平均値は %f です\n", average);
        
        return 0;
    }
    
[/code]

タグにxcodeと書かれているので、コンパイラはclang++を使っていると仮定してですが、`constexpr`が使えるのは`C++11`からなので、`clang++`へのコンパイルオプションに`-std=c++11`を指定することで`constexpr`が使えます。

今回僕は、Terminalから直接`clang++`でコンパイルしてみました。  
コマンドラインは以下のようになります。

[code]

    clang++ -std=c++11 constexpr.cpp
    
[/code]

実行結果は以下のようでした

[code]

    1, 2, 3, 5, 5, 2, 10, 100, 50, 33
    平均値は 21.100000 です
    
[/code]


CC BY-SA 4.0
2022-05-12T18:27:26.300
88792
2022-05-12T18:27:26.300
14745
88791
answer


> 別の方が書いたものを写させていただきました。

参照元に問題があります。

`constexpr`はC++言語の機能ですが、参照されたコードを見る限りC言語のコードのように見受けられます。C言語には`constexpr`は存在しませんので、エラーになるのも当然と言えます。

> 同じ役割があるもの

C++言語では[`std::size`関数](https://cpprefjp.github.io/reference/iterator/size.html)が用意されています。これを使うと配列のサイズをコンパイラーに導出させることができます。と言いますのも、配列の要素数を誤ると平均値もずれてくるため、配列サイズの計算はコンパイラーに任せるべきです。

[code]

    constexpr int numbers[] = { 1, 2, 3, 5, 5, 2, 10, 100, 50, 33};
    constexpr size_t numbers_size = std::size(numbers);
    
[/code]

C++言語で合計を求めるには[`std::accumulate`関数](https://cpprefjp.github.io/reference/numeric/accumulate.html)が用意されています。

[code]

    constexpr double total = std::accumulate(std::begin(numbers), std::end(numbers), 0.0);
    constexpr double average = total / numbers_size;
    
[/code]

`constexpr`を付けている通り、実はコンパイラーはコンパイル時にこの計算を行い、`total`は最初から`211`が格納され、`average`も`21.1`が格納されます。

* * *

なお

  * `std::size()`、`std::begin()`、`std::end()`を使用するためには`#include <iterator>`が
  * `std::accumulate()`を使用するためには`#include <numeric>`が

それぞれ必要になります。

* * *

C++言語は年々進化しており、どの機能がいつ使えるようになったのかを把握することも重要です。（yohjpさん指摘ありがとうございます。）

  * [`constexpr`](https://cpprefjp.github.io/lang/cpp11/constexpr.html)はC++11で登場し、[C++14](https://cpprefjp.github.io/lang/cpp14/relaxing_constraints_on_constexpr.html)、[C++20](https://cpprefjp.github.io/lang/cpp20/try-catch_blocks_in_constexpr_functions.html)などで順次拡張されています。
  * [`std::accumulate()`](https://cpprefjp.github.io/reference/numeric/accumulate.html)はC++03で登場していますが、C++20で`constexpr`対応しコンパイル時計算できるようになっています。
  * [`std::begin()`](https://cpprefjp.github.io/reference/iterator/begin.html)と[`std::end()`](https://cpprefjp.github.io/reference/iterator/end.html)はC++11で登場しています。
  * [`std::size()`](https://cpprefjp.github.io/reference/iterator/size.html)はC++17で登場しています。

また、コンパイラに対して使用したい言語バージョンを指定する必要があるかもしれません。


CC BY-SA 4.0
2022-05-12T21:20:50.907
88793
2022-05-13T15:49:53.573
2022-05-13T15:49:53.573
4236
4236
88791
answer