2017-08-29 92 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; 
} 

該代碼給出了no。存在於數組中的變量。 (請參閱變量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 

順便說一句:你是在你使用括號的不一致;他們不需要與sizeof除非該參數是一個類型名稱,所以第二個用途是隻

x = y/sizeof 1; 

這兩個通常相結合,但因爲你的陣列是匿名的,當然這是不可能在這裏。

+4

圍繞'sizeof'(表達式)的括號是風格問題。我總是把它們。 –

+0

我的問題是array(int [])是如何用值(0,1,2,3,4)初始化的。我還沒有看到這種初始化方式。 –

+0

@BasileStarynkevitch當然。有些人也用'return'來使用它們,但我喜歡在可能的情況下儘量說明語言是如何工作的,我有一種感覺,在這些東西周圍有很多貨物喋喋不休,我覺得很煩人。 – unwind

1

(int[]){0,1,2,3,4compound literal(引入C99)構造一個數組。這只是簡單地構建一個數組。

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

雖然,我猜這兩種方式都沒有要求,所以也可以創建它。 –