デフォルト引数が評価されるタイミング

デフォルト引数が評価されるタイミングが気になったので、ちょっと実行してみました。

c++のコード

#include <iostream>
#include <cstdlib>
#include <ctime>

void func(int i = rand())
{
    std::cout << i << std::endl;
}

int main(void)
{
    srand(time(NULL));
    func();
    func();
    func();
    return 0;
}

c++の結果

247111784
168458104
1083831553

rubyのコード

def func(i = rand())
  print "#{i}\n"
end

func
func
func

rubyの結果

0.418264634981435
0.894746224876965
0.805637328790286

pythonのコード

import random

def func(i = random.random()):
    print i

func()
func()
func()

pythonの結果

0.542012394526
0.542012394526
0.542012394526

というわけで、c++rubyは関数呼出時、pythonは関数定義時にデフォルト引数が評価されているようです。