2011-08-09 7 views
0

は、ここでCのコードスニペットのsizeofここではオペレータの説明

char *p="Hello World"; 
int a; 
char b; 
printf("%d\n",sizeof(p++)); 
printf("%c\n",*p); 

printf("%d",sizeof(a,b)); 
printf("%d",sizeof(b,a)); 

であるpがインクリメントされなかった理由を

4 
H 
1 
4 

は誰が説明することができ、ここでカンマ演算子の使用は何で出力されます。私はそれがVLAと関係があると読んでいます。

答えて

10

pがインクリメントされませんでした(そう、例えばsizeof(a,b)sizeof(b)のようなものです)、それだけの種類を使用しています表現。

sizeofは、1つの式をオペランドとして取ります。ではなく、の括弧で囲まれた引数リストです。したがって、sizeof(a,b)では、単一オペランドは(a,b)です。従って、sizeof(a,b)のコンマは、コンマ演算子ではなく、コンマ演算子ではなく、コンマ演算子ではなく、コンマ演算子ではありません。コンマ演算子ではなく、引数の区切り文字であるprintf("%c\n", *p)のコンマと異なります。

評価すると、カンマ演算子は最初に左辺を評価し、次に右辺を評価します。演算子の結果は右辺の結果です。したがって、(a,b)は評価されませんが、式の型は右側の型です。従ってsizeof(a,b)sizeof(b)に相当します。実際には、少なくともここではコンマ演算子の「使用」はありません。それを読む能力をテストする以外は無意味です。

VLA(可変長配列)とは関係ありません。

VLAとの関係は、sizeofをVLAに適用すると、と定義されています(C99の6.5.3.4/2)。もちろんVLAのサイズはコンパイル時には分かりません。

しかし、カンマ演算子のRHSで使用すると、VLAの名前は他の配列と同様にポインタに減衰します。これは6.3.2.1/3です:配列が崩壊せず、 "sizeofのオペランド"がそのうちの一つであるが、 "コンマ演算子のRHS"はそうではない3つのケースがあります。だから、(私のマシン上)

#include <stdio.h> 
int main() { 
    int a = 10; 
    int b[a]; // VLA 
    const char *p = "Hello"; 
    printf("%d\n", sizeof(++p, b)); 
    printf("%d\n", sizeof b); 
    printf("%c", *p); 
} 

プリント:

4 
40 
H 

最初sizeofに、コンマ演算子のRHS上のVLA、sizeofのオペランドの型がありますにもかかわらずであるため、 int*であり、VLAではないため、(++p, b)は評価されません。第2のsizeofでは、オペランドの型はVLAであり、であり、そのサイズは10*sizeof(int)です。

+1

sizeofがそのオペランドを評価しないことは前提条件ではなく、前処理中に評価しますが、結果のバイナリにオペランドが含まれていない場合は、数値に置き換えられます。 'printf( "%d \ n"、sizeof(a + b));と入力すると、オペランドが整数のプロモーションとバランシングの規則に従って評価されたため、結果4が得られることがわかります。 – Lundin

+3

@ Lundin:それは*オペランドを評価するのではなく、ただ解析するだけです。 'int'と' char'を追加した結果の型は、 'int'であることが分かります。 6.5.3.4/2を参照してください(私の回答を編集する必要があることも指摘しています) –

1

sizeof演算子はコンパイル関数です(たとえば、コンパイル時に定数に計算されます)。

  1. これは、p ++が無視され、pのタイプのみが使用されることを意味します。カンマがある場合は、最後のパラメータが使用されている
  2. sizeofは、そのオペランドを評価しませんので、
+2

'sizeof'は、可変長配列など、コンパイル時に必ずしも計算されるとは限りません。 – dreamlax

+0

私はそれを知らなかった、ありがとう。 (この質問には関係ありませんが) – MByD

+1

sizeofはそのオペランドを評価せず、前処理中に評価しますが、結果のバイナリには単に含まれていません。数。 'printf( "%d \ n"、sizeof(a + b));と入力すると、オペランドが整数のプロモーションとバランシングの規則に従って評価されたため、結果4が得られることがわかります。 – Lundin

関連する問題