關鍵字static
1.static 修飾局部變量時,相當於改變了其生命週期,但不改變作用域
2.static 修飾全局變量,代表該變量僅在本文件內有效(沒有static 修飾 全局變量+聲明之後支持跨文件引用)
3.static 修飾函數,該函數只在本文件內被調用或訪問,不能跨文件訪問(函數本身在另一個文件+聲明之後支持跨文件引用)
對第一點的演示
沒有static 修飾情況下的局部變量
#include<stdio.h>
#include<Windows.h>
void MyShow()
{
int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (; j < 5; j++)
{
MyShow();
}
system("pause");
return 0;
}
出了作用域 i 的生命週期和作用域均無效
每次執行 for 循環的時候 i 都會被重新創建與賦值
加上了 static 之後
#include<stdio.h>
#include<Windows.h>
void MyShow()
{
static int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (; j < 5; j++)
{
MyShow();
}
//printf("%d\n", i); //這條語句如果加上會報錯未定義i 從而能證明i的作用域並未改變
system("pause");
return 0;
}
i 只在第一次調用的時候創建一次,此後執行i++語句 但注意只改變了 i的 生命週期,但不改變作用域
對第二點的演示
code.c
#include<stdio.h>
#include<windows.h>
int g_value = 10;//定義
test.c
#include<stdio.h>
#include<Windows.h>
extern int g_value;// 聲明
int main()
{
printf("%d\n", g_value);
system("pause");
return 0;
}
結果就是輸出10
#include<stdio.h>
#include<windows.h>
static int g_value = 10;//定義
加上static 之後,報警,無法解析的外部符號g_value --鏈接性錯誤
定義與聲明
定義只能定義一次(開闢空間+防止內容),而聲明可以多次聲明
對第三點的演示
code.c
#include<stdio.h>
#include<windows.h>
static void MyShow()
{
int i = 0;
i++;
printf("%d\n", i);
}
test.c
#include<stdio.h>
#include<Windows.h>
extern void MyShow();
int main()
{
MyShow();
system("pause");
return 0;
}
與二原理相同,加上static 之後無法解析的外部符號MyShow --鏈接性錯誤
全局變量和函數混用 static
code.c
#include<stdio.h>
#include<windows.h>
static int g_value = 10;//定義
void MyShow() //如果 static void MyShow() 會怎麼樣? 顯然報警告
{
static int i = 0;
for (; i < 5; i++)
{
printf("%d\n", g_value);
}
}
test.c
#include<stdio.h>
#include<Windows.h>
extern void MyShow();
int main()
{
MyShow();
system("pause");
return 0;
}
關鍵字typedef
#include<stdio.h>
#include<Windows.h>
typedef unsigned int unit;
int main()
{
unsigned int num1 = 0;
unit num2 = 1;
printf("%d\n", num1);
printf("%d\n", num2);
system("pause");
return 0;
}
unsigned int 老的類型
unit 新的類型的名字 相當於 Int、 char 等等
unsigned 無符號
整型的每一種(int short long longlong)都有無符號(unsigned)和有符號(signed)兩種類型,在默認情況下聲明的整型變量都是有符號的類型,如果需聲明無符號類型的話就需要在類型前加上unsigned。
1、signed是默認的,表示這個變量是有符號的,可以存儲整數和負數。
2、unsigned則需要顯示給出表示這個變量,沒有符號值能存儲數的大小,而且不能表示正負。
signed存儲符號是有代價的,代價就是存儲空間中的一個比特位專門用來存儲符號,這一位不能表示數值。一般來說,同類型的signed能夠存儲的數的絕對值大小要小於undigned。
4、unsigned的作用就是將數字類型無符號化, 例如 int 型的範圍:-2^31 ~ 2^31 - 1,而unsigned int的範圍:0 ~ 2^32。