「関数へ渡す引数」が少ない場合の挙動


**PHP 7.1 以降で、(ユーザ定義)関数へ渡す引数が少ない場合エラーになることを知り驚きました**

* * *

**Q1.他のプログラミング言語では、関数に渡す引数が少ない場合、一般的にはどういう挙動になるのでしょうか？**  
・これに関して、実装の流行りとかそういうのはあるのでしょうか？

**Q2.「言語に組み込みの関数」と「ユーザ定義関数」の挙動は一般的には異なるのでしょうか？**

* * *

**質問背景**  
・「関数へ渡す引数が少ないことを認めない言語」の方が多い、もしくはそれが普通かどうか、知りたいと思ったので




## A1. エラーになる言語もありますが、許容する言語もあります

C 言語では通常はエラーになりコンパイルが通りません。

[code]

    int add(int a, int b) {
      return a + b;
    }
    
    int main() {
      add(0);  // ←エラー
      return 0;
    }
    
[/code]

しかし、可変長引数という仕組みを使うと許容されます。

[code]

    int add(int a, ...) { // ... は２つ目以降を受け取ることを表す
      va_list ap;
      va_start(ap, a);
      int x = a + va_arg(ap, int);
      va_end(ap);
      return x
    }
    
    int main() {
      add(0);  // 実行されますが返ってくる値は不定です
      return 0;
    }
    
[/code]

C++ ではデフォルト引数というものを使うと許容されます。

[code]

    int add(int a, int b = 0) { // 指定しなかった場合の引数を指定できます
      return a + b;
    }
    
    int main() {
      add(0);  // b は 0 として扱われるので 0 が返ってきます
      return 0;
    }
    
[/code]

Javascript では実行されます。

[code]

    function add(a, b) {
      return a + b;
    }
    
    add(0); // 動作します。b は undefined という指示されていないという意味の値になり、 NaN を返します
    
[/code]

デフォルト引数と可変長引数どちらも言語特有ではなく多くの言語にある仕組みです。

> 「関数へ渡す引数が少ないことを認めない言語」の方が多い、もしくはそれが普通

JavaScript
のようなどんな数の引数でも認める言語は少ないと思いますが、多くの言語はデフォルト引数と可変長引数があるので、そういう意味では引数が少ないことを認める言語のほうが多いと思います。

## A2. 関数がどのように定義してあるかによります

PHP にもデフォルト引数、可変長引数があるので、それを使っている関数の場合は引数を少なくすることができます。




## A1. エラーになる言語もありますが、許容する言語もあります

C 言語では通常はエラーになりコンパイルが通りません。

[code]

    int add(int a, int b) {
      return a + b;
    }
    
    int main() {
      add(0);  // ←エラー
      return 0;
    }
    
[/code]

しかし、可変長引数という仕組みを使うと許容されます。

[code]

    int add(int a, ...) { // ... は２つ目以降を受け取ることを表す
      va_list ap;
      va_start(ap, a);
      int x = a + va_arg(ap, int);
      va_end(ap);
      return x
    }
    
    int main() {
      add(0);  // 実行されますが返ってくる値は不定です
      return 0;
    }
    
[/code]

C++ ではデフォルト引数というものを使うと許容されます。

[code]

    int add(int a, int b = 0) { // 指定しなかった場合の引数を指定できます
      return a + b;
    }
    
    int main() {
      add(0);  // b は 0 として扱われるので 0 が返ってきます
      return 0;
    }
    
[/code]

Javascript では実行されます。

[code]

    function add(a, b) {
      return a + b;
    }
    
    add(0); // 動作します。b は undefined という指示されていないという意味の値になり、 NaN を返します
    
[/code]

デフォルト引数と可変長引数どちらも言語特有ではなく多くの言語にある仕組みです。

> 「関数へ渡す引数が少ないことを認めない言語」の方が多い、もしくはそれが普通

JavaScript
のようなどんな数の引数でも認める言語は少ないと思いますが、多くの言語はデフォルト引数と可変長引数があるので、そういう意味では引数が少ないことを認める言語のほうが多いと思います。

## A2. 関数がどのように定義してあるかによります

PHP にもデフォルト引数、可変長引数があるので、それを使っている関数の場合は引数を少なくすることができます。

