2017-01-07 34 views
2

これを観察したときに問題が発生しました。 Functionは、プログラムのある時点から呼び出すことができる名前が与えられた文のグループであると考えられるからです。私はこのプログラムを実行すると引数なしで呼び出された関数がエラーを返さない

#include <iostream> 
#include <vector> 
using namespace std; 

int getAbsolute(int x) { 
    return x > 0 ? x : -1*x; 
} 

int main() { 
    vector<int> arr; 

    for(int i = -5; i < 5; i++) 
    arr.push_back(i); 

    for(int i = 0; i < arr.size(); i++) { 
    cout << "abs(" << arr[i] << ") : " 
     << getAbsolute << endl; 
    } 
} 

[email protected]~/Dropbox/cprog/demos : $ g++ testFunction.cpp 
[email protected]~/Dropbox/cprog/demos : $ ./a.out 
abs(-5) : 1 
abs(-4) : 1 
abs(-3) : 1 
abs(-2) : 1 
abs(-1) : 1 
abs(0) : 1 
abs(1) : 1 
abs(2) : 1 
abs(3) : 1 
abs(4) : 1 
[email protected]~/Dropbox/cprog/demos : $ 

を私の質問は、なぜ、このプログラムは私に私はエラーを与えるものではありません、ある整数の絶対値を与える簡単なプログラムを考えてみましょう議論を呼ぶことになっています、私のg ++​​に何か問題がありますか(-v 4.8.5)?そして、なぜこのプログラムの出力は各呼び出しで1になるのでしょうか?または、私はここに何かを逃している?私は本当に混乱しています。

+1

あなたは関数を呼び出すのではなく、そのアドレスを使用しています – torkleyy

+0

しようとしたかったのは 'getAbsolute()'でした。 – torkleyy

+0

1はgetAbsoluteメモリアドレスから逆参照された値ですか?しかし、コンパイラは、関数のアドレスが生のポインタにすぎないので、どのくらい読む必要があるのか​​をどのように決定しますか? –

答えて

1

この文

cout << "abs(" << arr[i] << ") : " 
     << getAbsolute << endl; 

正しいです。関数指定子暗黙的にgetAbsoluteは、関数宣言

int getAbsolute(int x); 

に応じて関数ポインタint (*)(int)に変換され、このポインタは、以下のオペレータoperator <<

basic_ostream<charT,traits>& operator<<(bool n); 

を使用して出力されますが、この

ような結果を得ます
abs(-5) : 1 

関数ポインタがゼロに等しくなく、このop eratorは、そのような型の関数ポインタのために最もオーバーロードされた演算子operator <<です。

+0

この質問は重複しています。あなたは答えるよりもそれを閉じるほうがいいです:) –

関連する問題