12

この質問の作者は、私が彼に何をするのか尋ねたとき、私をからかっただけ sizeof * qです...彼は、それは本当に基本的なCの質問であり、私はそれをチェックする必要があると私に言いました. しかし、私はSOを見回し、以前に尋ねた人を見たことがなかったので、今は自分でやります:

sizeof括弧や型なしで C を使用すると、C はどうなりますか?

4

5 に答える 5

23

したがってsizeofC99 ドラフト標準セクションの6.5.3 単項演算子の段落1の文法を見ると、次のようになります。

sizeof unary-expression
sizeof ( type-name )

括弧とセクションなしでタイプ名を使用できないという違いがあります6.5.3.4 。 sizeof 演算子の段落2には次のように書かれています (強調鉱山):

sizeof 演算子は、そのオペランドのサイズ (バイト単位) を生成します。これは、式または括弧で囲まれた型の名前です。[...]

完全を期すために、括弧がある場合に式を使用できるかどうか疑問に思うかもしれません。単項式自体に括弧を含めることができるsizeofため、答えはイエスです。これを確認する最も簡単な方法は、ドラフト標準のセクション式を調べて、次のように文法を確認することです。A.2.1

unary-expression -> postfix-expression -> primary-expression -> ( expression )
于 2013-09-19T15:26:15.123 に答える
21

sizeof()は関数ではなく演算子であるため、オペランドが式の場合は必要ありません(ただし、通常は使用します)。sizeof * q == sizeof(*q). オペランドが型の場合、 を使用する必要があることに注意して()くださいsizeof(int)(たとえば、http://en.wikibooks.org/wiki/C_Programming/Reference_Tablesを参照してください) 。

sizeof      sizeof operator for expressions sizeof 123
sizeof()    sizeof operator for types       sizeof (int)

現在、ウィキでさえ C に関する情報でいっぱいです... 世界は急速に変化しています :-)

sizeof 演算子は、指定されたデータ型がメモリ内で占有するスペースの量を決定するために使用されます。sizeof を使用するには、キーワード「sizeof」の後に型名または式 (単なる変数名の場合もあります) を続けます。型名を使用する場合は、必ず括弧で囲む必要がありますが、式は括弧の有無にかかわらず指定できます。

于 2013-09-19T15:24:39.907 に答える
8

sizeof演算子、具体的には単項演算子&または単項演算子++です。オペランドとして、単項式または括弧で囲まれた型名のいずれかを取ります。

構文は次のとおりです。

  sizeof単項式 
  sizeof (型名)

したがって、次のような宣言が与えられた場合

int *q;

sizeof *qとは、 ととsizeof (int)同様に等価です。 sizeof qsizeof (int *)

于 2013-09-19T15:29:11.583 に答える
3

括弧で行うのと同じこと - 渡したもののサイズ、この場合は が指すもののサイズを返しますq

mallocただし、特にandの複雑な呼び出しに関与する場合は、やや明確ではないsizeofため、常に括弧を使用することがベストプラクティスであると考えています。

于 2013-09-19T15:25:21.043 に答える
3

括弧付きの sizeof と同じこと。これは右側の単項演算子なので、右側のサイズをオペランドとして扱います。
私の知る限り、基本データ型で sizeof を使用する場合、括弧は必須です。

変数があるint a場合、そのサイズを両方の方法で確認できます。括弧は必須ではありません: sizeof a,sizeof (a)は同じように機能します。
ただし、 int 自体のサイズをチェックする場合のみsizeof (int)機能します。

于 2013-09-19T15:25:03.440 に答える