C中變數的宣告與定義
在C中,變數的定義主要可分為兩種狀況:在函式內和在函式外。
但變數在函式內定義時,其屬性只能分為static和無static,而該變數便無法被外部函式所引用。而定義為static時表示該變數只能用來初始化一次。
而變數在函式外定義時,其屬性也只能分為static和extern,而如果不以static來修飾變數,編譯器便會預設將該變數的屬性設為extern(等同於使用extern來定義)。
若為static,則表示該變數只能在定義的檔案裡使用,無法被別的檔案裡的程式呼叫。
關於宣告:變數的宣告預設著需要通過extern來進行宣告,而且宣告可以進行多次,而被宣告的變數應為extern屬性,即其屬性不能被宣告為static。
而宣告可以在函式內部,也可在函式外部。
1、 變數在同一個檔案裡定義
(1)變數在函式外定義
#include <stdio.h>
int i = 12;
int main()
{
printf(“thei in the 1.c is %d\n”, i);
}
結果為
the i in the 1.c is 12.
(2)變數在函式內也定義
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
}
結果為
the i in the 1.c is 123.
對比上面可知,如果函式內定義了與函式外同一名字的變數(即函式的全域性變數和區域性變數同名),則區域性變數會覆蓋全域性變數。
(3)、變數在函式內進行extern引用
#include <stdio.h>
int i = 12;
int main()
{
externint i;
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
}
結果為:
編譯器提示出錯,i被重複定義了。
(4)變數在函式外進行extern宣告
#include <stdio.h>
extern int i = 12;
int main()
{
externint i;
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
}
結果:
可以發現,會有警告,其仍可執行,且結果正確。
2、 變數在多個檔案間
(1)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現在1.c中定義的i僅在1.c可用,而2.c中不可用。
(2)在1.c中:
#include <stdio.h>
extern int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
在1.c中對變數是否加extern無法影響2.c中的i。
(3)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
void a2(void)
{
extern int i;
printf(“thei in the 2.c is %d\n”, i);
}
結果:
(4)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i;
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
(5)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i;
void a2(void)
{
inti = 2123;
printf(“thei in the 2.c is %d\n”, i);
}
結果:
(6)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i =212;
void a2(void)
{
inti = 2123;
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現通過externint進行定義的話,會與1.c中的int i衝突而出錯。
(7)在1.c中:
#include <stdio.h>
int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
int i = 212;
void a2(void)
{
inti = 2123;
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現如果變數在函式外定義,其預設已加上了extern。
(8)在1.c中:
#include <stdio.h>
static int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
int i = 212;
void a2(void)
{
inti = 2123;
printf(“thei in the 2.c is %d\n”, i);
}
結果:
在1.c中在變數前加上static便可避免了衝突,因為static將該變數變為了區域性的變數。
(9)在1.c中:
#include <stdio.h>
static int i = 12;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i;
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現如果變數被宣告為static後,便無法通過extern來對之進行呼叫。
(10)在1.c中:
#include <stdio.h>
int main()
{
externint i = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i;
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現函式內部的變數無法定義為extern型別。
(11)在1.c中:
#include <stdio.h>
extern int i = 1123;
int main()
{
inti = 123;
printf(“thei in the 1.c is %d\n”, i);
a2();
}
在2.c中:
extern int i;
extern int i;
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
}
結果:
可以發現,變數的宣告可以多次宣告,程式可正常執行。
(12)在1.c中:
#include <stdio.h>
extern int i = 1123;
int main()
{
printf(“thei in the 1.c is %d\n”, i);
a2();
printf(“the i inthe 1.c is %d\n”, i);
}
在2.c中:
extern int i;
extern int i;
void a2(void)
{
printf(“thei in the 2.c is %d\n”, i);
i= 212;
}
結果:
看了一個百度知道的解釋不錯,在此附上對應網址:https://zhidao.baidu.com/question/570728680.html