2017-08-29 12 views
0
#include <stdio.h> 
#include <stdarg.h> 

int main() 
{ 
    int x,y; 

    y = sizeof(int[]){0,1,2,3,4} ; 
    x = y/sizeof(1); 

    printf("Number of arguments: %d", x); 

    return 0; 
} 

このコードは、配列に存在する変数の数。 (変数yを参照) この配列はどのように初期化されますか? 私は配列がこのように初期化されていると思う:int a[]={variables}。 アレイを初期化する方法が他にもある場合は、その点をご記入ください。配列はsizeof演算子の助けをかりてどのように初期化されますか?

+0

https://stackoverflow.com/questions/3137671/declaring-and-initializing-arrays-in-c –

答えて

2

コードでは、複合リテラルを使用して「インライン」(匿名)配列を使用しています。

配列はsizeofでのみ使用されるため、実際の実行時配列は構築も初期化もされていません。コンパイラがコンパイル時にコードを検査してその型を調べるだけです。

迅速godboltingが私たちを与える:ところで

push rbp 
mov  rbp, rsp 
mov  DWORD PTR [rbp-20], edi 
mov  QWORD PTR [rbp-32], rsi 
mov  DWORD PTR [rbp-4], 20 # Load 'y' with 20 (size of 5 ints) 
mov  eax, DWORD PTR [rbp-4] 
cdqe 
shr  rax, 2     # Divide by four, giving 5. 
mov  DWORD PTR [rbp-8], eax 
mov  eax, DWORD PTR [rbp-8] 
pop  rbp 
ret 

:あなたは括弧の使用に矛盾しているしています。彼らは、引数がタイプ名がある場合を除き二次利用はちょうど

x = y/sizeof 1; 

これら二つは、一般的に組み合わされてかもしれないので、sizeofでは必要ありませんが、あなたの配列はもちろん、匿名であるため、それはここではできませんしています。

+4

「sizeof」(式用)の前後の括弧は、スタイルの問題です。私はいつもそれらを置く。 –

+0

私の質問は配列(int [])が値(0,1,2,3,4)で初期化される方法です。私は初期化のこの方法を見ていない。 –

+0

@BasileStarynkevitch何人かの人が「帰国」して使っている人もいますが、できるだけ言語がどのように働いているのか光り輝くのが好きです。これらのことを悩ませていることがたくさんあります。 – unwind

1

(int[]){0,1,2,3,4は、アレイを構成する(C99に導入された)compound literalである。これは単純に配列を構築します。

n1570-§6.5.2.5/ P3:

イニシャライザの中括弧で囲まれたリストが続く括弧タイプ名から成る後置表現は、リテラルの化合物です。それは初期化子リストによって値が与えられる無名のオブジェクトを提供します。 99)

sizeof (int[]){0,1,2,3,4}は、バイトの配列(int[]){0,1,2,3,4}の大きさを与えます。 sizeof (1)intのサイズを与えます。したがって、y/ sizeof (1)は配列内の要素の数を示します。このステートメントで

+0

ありがとう、私はそれについて知りませんでした。 –

1

y=sizeof (int[]){0,1,2,3,4} ; 

二つのものがあります。最初のものは、タイプint[5]の化合物リテラルint[]){0,1,2,3,4}が使用されています。名前のない整数配列です。初期化子の数から要素の数を取得する複合リテラルが使用されています。 sizeof演算子が式を評価しないため、どちらの配列も作成されていないことを考慮してください。そのタイプを決定するだけです。

実際にはこの文は、複合リテラルを使用して

y = sizeof(int[5]); 

と同等であるだけで、コンパイラ自体ではなく、自分が自分でこれを行うための配列の要素の数を計算することができます。

+0

実際に*これまでにリテラルを作成していますか? 'sizeof'は評価しません... –

+0

@AnttiHaapala良い発言です。私はsizeof演算子が使用されていることを考慮に入れませんでした。 :)私の投稿を更新します:) –

+0

しかし、私はどちらかの要件がないと思うので、作成することもできます。 –

関連する問題