2012-02-10 10 views
3
static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof(a)/sizeof(int); 

ANSI 99のショートカットはありますか?このCコードよりも短い配列の長さを見つける方法はありますか?

+1

良い質問です。私はCのように見える。 – mikithskegg

+1

(VLAを除く) 'sizeof arr/sizeof * arr'はコンパイル時定数です。なぜあなたは別の方法を望んでいますか? *マクロを試してください。* – pmg

+3

'int len = 12'? ;) – Nim

答えて

5

私はショートカットがないと思いますが、あなたの猫用マクロ:

#define arrlen(arr) (sizeof(arr)/sizeof(arr[0])) 
+2

+1が、大文字で書かれているので、マクロであることがわかります。 –

1

は、このCコードよりも配列の長さを見つけるために短い方法はありますか?

はい、1文字の短い方:

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof a/sizeof(int); 

編集: @pmgによって提案され、さらに短いバージョンがあります:

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11}; 
int len=sizeof a/sizeof*a; 

ます。また、識別子lenのための少ない文字を使用することができます。

:)

+1

hehe: 'sizeof a/sizeof * a':あなたのバージョンより3文字少ないです。 – pmg

+0

@pmg:私はあきらめる。あなたは勝つ。 :) – NPE

+0

待機 - どのように?!? OK私はもっと勉強しなければならない!ありがとう! – Coffee

1

あなたは配列に要素の数をしたい場合は、

sizeof arr/sizeof *arr 

または

sizeof arr/sizeof arr[0] 

はそれを取得と同じくらい短いです。 arrがVLAでない限り、これらはコンパイル時に計算されることに注意してください。

arrの配列の式で、ポインタではない場合にのみ機能することにも注意してください。あなたは

void foo(int arr[]) 
{ 
    size_t len = sizeof arr/sizeof *arr; 
    ... 
} 

ような何かを行う場合は、この文脈でarrポインタ表現、ではない配列であるので、あなたは、あなたが期待する答えを得ることはありません(オンラインC language standardに§ 6.3.2.1 ¶ 3を参照してください。および§ 6.5.7.3 ¶ 7)。

関連する問題