は、次のコードを考えてみます。はsizeof()が構造に適用し、変数
struct foo {
int a;
int b;
int c;
};
struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));
コードは同じ値を返しますが、はsizeof()が変数に適用された場合、私は思っていたが正しいですか、これは単なる偶然では?
ありがとうございました。
は、次のコードを考えてみます。はsizeof()が構造に適用し、変数
struct foo {
int a;
int b;
int c;
};
struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));
コードは同じ値を返しますが、はsizeof()が変数に適用された場合、私は思っていたが正しいですか、これは単なる偶然では?
ありがとうございました。
どちらも実際に同じ値を返す必要があります。 MSDNから
:
sizeof演算子
は、sizeof演算子は、オペランドの型のオブジェクトを格納するために必要な、バイト単位で、ストレージの量を与えます。この演算子を使用すると、プログラムにマシン依存のデータサイズを指定することを避けることができます。
sizeof unary-expression
sizeof (type-name)
これは予想どおりです。つまり、両方とも同じ値を返します。この値はコンパイル時に計算されます。
は、これは通常、あなたが後でタイプを変更する場合がありますので、サイズが同様に変更される場合がありますようsizeof
で変数を使用することをお勧めします。
一般的には、変数に適用することが好ましいです。変数の型が変更された場合、正しいままになります。
この方法の欠点は、変数の型を "構造体"から "構造体へのポインタ"に変更すると、sizeof(変数)が4(またはアーキテクチャに応じて8)になり、コンパイラが警告。 – ivanzoid
sizeof
は、タイプとの式で動作します。タイプに適用すると、()
はsizeof
の一部で、sizeof(type)
となります。式()
に適用すると、sizeof
構文の一部ではありません:sizeof expression
。
だからあなたの第二sizeof
は、「変数に適用され、」本当にではありません。これは式(f)
に適用されます。この式は、()
の冗長ペアに囲まれた単一の変数f
で構成されています。また、()
の冗長ペアを使用せずに、sizeof f
だけを使用することもできます。
sizeof
が式に適用する場合、それは式の結果(式が有するタイプの、すなわちサイズ)のサイズを返します。あなたの例では、sizeof
の両方のアプリケーションが同じ値に評価されることが保証されています。
実際には、良いプログラミング方法は、可能な限りsizeof(type)
を回避することです。すなわち、sizeof expression
を使用することをお勧めします。これにより、コードはより型に依存しなくなります。これは常に良いことです。型名は宣言にほかにはありません。
Googleに「sizeofを変数に適用しましたか?最初の2つの結果(そのうちの1つはStackOverflowのものです)があなたの質問に答えることができました。 –
はい、両方の 'sizeof'式は同じ値を返します。 2番目のものはかっこを必要としないことに注意してください。 'sizeof'は演算子であり、関数ではありません。しかし '%u'は' size_t'ではなく 'unsigned int'型の引数を必要とします。これを書いてください: 'printf("%zu%zu \ n "、sizeof(struct foo)、sizeof f);またはこれ:' printf( "%lu%lu \ n"、(unsigned long)sizeof(struct foo) 、(unsigned long)sizeof); '。 '%zu'はC99特有の機能です。あなたのシステムの 'printf'はそれをサポートしていません。 –