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)
です。
sizeofがそのオペランドを評価しないことは前提条件ではなく、前処理中に評価しますが、結果のバイナリにオペランドが含まれていない場合は、数値に置き換えられます。 'printf( "%d \ n"、sizeof(a + b));と入力すると、オペランドが整数のプロモーションとバランシングの規則に従って評価されたため、結果4が得られることがわかります。 – Lundin
@ Lundin:それは*オペランドを評価するのではなく、ただ解析するだけです。 'int'と' char'を追加した結果の型は、 'int'であることが分かります。 6.5.3.4/2を参照してください(私の回答を編集する必要があることも指摘しています) –