2017-05-31 76 views
2

請參考下面的程序。我收到以下編譯器警告。做「int i = 10;」和「int i; i = 10;」當我是一個全局變量時執行不同的功能?

的bash-3.2 $ GCC -Wall test1.c test1.c:6:警告:數據定義沒有類型或存儲類 test1.c:6:警告:類型默認爲 'INT' 中的'聲明j'

通常,當運行時操作寫入函數之外時,會引發此警告。所以我在質疑爲什麼在全局範圍內,「int j; j = 20」會拋出警告,但「int i = 10」不會?

#include <stdio.h> 

    int i = 10; 

    int j; 
    j=20; 

    int 
    main(void) 
    { 
     int k; 

     k = 30; 

     printf("%d %d %d\n", i, j, k); 

     return 0; 
    } 
+0

您是否讀過警告直到結束? – DeiDei

+0

@DeiDei:我現在看到它。 「警告:在'j'的聲明中輸入default'int'實際上是告訴j = 20是一個聲明。謝謝。 – NeilB

回答

7

此行

j=20; 

是不是賦值。它是j的聲明,它使用隱式類型int

ç讓你做同一變量的多個聲明在全球範圍內,只要它們匹配:

int j; 
int j; 
int j = 20; 

預C99 C類標準還承擔int類型,當你不指定任何類型。

這裏是你如何能打破你的例子:

double j; 
j = 20; 

這並不編譯,因爲j被聲明爲double,然後重新聲明爲int

+2

請注意,隱式int僅在C89中有效,在C99及更高版本中無效。 – DeiDei

+0

@DeiDei你是對的,我應該提到這種做法已被禁止了很長一段時間。 – dasblinkenlight

+2

暫定義在C99和C11中也是合法的。它只是C99中「停止工作」的隱式int –

0

int i; 是一個試探性的定義。 下面的定義I = 10;將其轉換爲聲明。

相關問題