1

sizeof の動作に関する情報が見つかりません (少なくとも gcc 4.6 以降)。次のコードは機能し、「期待される」結果 (4、1、8) を生成しますが、その理由は不思議です。いくつかの質問を確認しましたが、このような例はありません。

#include<iostream>

int f1(int) {
  return 0;
}

char f2(char) {
  return 0;
}

double f3() {
  return 0;
}

int main() {
  std::cout << sizeof(f1(0)) << std::endl;
  std::cout << sizeof(f2('0')) << std::endl;
  std::cout << sizeof(f3()) << std::endl;

  return 0;
}

回答をいただければ幸いです。ありがとう。

4

4 に答える 4

4

演算子はsizeof、型または式を引数として取り、その引数のサイズを返します。式を使用しているため、それらの式のサイズが返されます。式は実行時に評価されないため、関数が呼び出されることはありません。ただし、結果のサイズを決定するために、正しい (オーバーロードされた) 関数が使用されます。

(現在は削除された) コメントで、user1919074は次のように述べています。

sizeof(f1)うまくいかない

脳のおなら

Cでは、sizeof(f1)関数へのポインタのサイズを返すため、機能します。

sizeof()演算子を関数名に直接適用することはできません。これには特別な規則があり、配列に適用されると、ポインターに対する通常の「減衰」は発生しません。同様に、関数名の関数ポインタへの変更は、 では発生しませんsizeof()。(もちろん、GCC-pedanticに警告/エラーを表示させるには、GCC を激しく突く必要があります。そうしないと、関数のサイズとして 1 が返されます。)

于 2013-05-10T14:33:40.843 に答える
2

関数で何が起こっているか

int f1(int) {
  return int(0);
}

char f1(char) {
  return char(0);
}

double f1() {
  return double(0);
}

後で何が起こっているのか。

std::cout << sizeof(int(0)) << std::endl;
std::cout << sizeof(char('0')) << std::endl;
std::cout << sizeof(double(0)) << std::endl;

関数から返さsizeofれたvalueもののを出力しているため

于 2013-05-10T14:35:37.673 に答える
0

f1 は、4 バイトの整数を返します。
f2 は、1 バイトの文字を返します。
f3 は、8 バイトの double を返します。

したがって、 sizeof() が行うことは、その引数のサイズを返すことだけです。

于 2013-05-10T14:43:11.790 に答える