變量定義
變量定義就是告訴編譯器在何處創建變量的存儲,以及如何創建變量的存儲。
type variable_list;
在這裏,type必須是一個有效的C數據類型,可以是char、w_char、int、float、double或任何用戶自定義的對象,variable_list可以由一個或多個標識符名稱組成。
變量聲明
變量聲明向編譯器保證變量以指定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節的情況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編譯器需要實際的變量聲明。
extern int i; //聲明,不是定義
int i; //聲明,也是定義 建立存儲空間
extern 外部的,出現即指外部變量
實例
#include<stdio.h>
// 函數外定義變量 x 和 y
int x;
int y;
int addtwonum()
{
// 函數內部聲明變量x和y爲外部變量
extern int x;
extern int y;
// 給外部變量(全局變量)x和y賦值
x = 1;
y = 2;
return x+y;
}
int main()
{
int result;
//調用函數 addtwonum
resule = addtwonum();
printf("result 爲:%d",result);
return 0;
}
如果需要在一個源文件中引用另外一個源文件中定義的變量,我們只需在引用的文件中將變量加上extern關鍵字的聲明即可。
addtwonum.c 文件代碼:
#include<stdio.h>
/* 外部變量聲明*/
extern int x;
extern int y;
int addtwonum()
{
return x+y;
}
test.c 文件代碼:
#include<stdio.h>
/*定義兩個全局變量*/
int x = 1;
int y = 2;
int addtwonum();
int main(void):
{
int result;
result = addtwonum();
printf("result 爲:%d",result);
return 0;
}
編譯執行上述代碼
gcc addtwonum.c test.c -o main
./main
result 爲:3
整數常量
整數常量可以是十進制、八進制或十六進制的常量。前綴指定基數:0x或0X表示十六進制,0表示八進制,不帶前綴則默認表示十進制。
整數常量也可以帶一個後綴,後綴是U和L的組合,U表示無符號整數(unsigned),L表示長整數 (long)。後綴可以是大寫也可以是小寫
浮點常量
浮點常量由整數部分、小數點、小數部分和指數部分組成。您可以使用小數形式或者指數形式來表示浮點常量。
當使用小數形式表示時,必須包含整數部分、小數部分,或同時包含兩者。當使用指數形式表示時, 必須包含小數點、指數,或同時包含兩者。帶符號的指數是用e或E引入的。
字符常量
字符串常量
定義常量
#define預處理器
#define identifier value
實例:
#include<stdio.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main()
{
int area;
area = LENGTH * WIDTH;
printf("value of area : %d",area);
printf("%c",Newline);
return 0;
}
const 關鍵字
可以使用const前綴聲明指定類型的變量,如下:
const type variable = value;
實例:
#include<stdio.h>
int main()
{
const int LENGTH 10;
const int WIDTH 5;
const int NEWLINE '\n';
int area;
area = LENGTH * WIDTH;
printf("value of area : %d",area);
prtintf("%c",NEWLINE);
return 0;
auto存儲類
auto存儲類是所有局部變量默認的存儲類。
{
int mount;
auto int month;
}
上面的實例定義了兩個帶有相同存儲類的變量,auto只能用在函數內,即auto只能修飾局部變量。
register存儲類
register存儲類用於定義存儲在寄存器中而不是RAM中的局部變量。這意味着變量的最大尺寸等於寄存器的大小(通常是一個詞),且不能對它應用一元的’&'運算符(因爲它沒有內存位置)。
{
register int miles;
}
寄存器只用於需要快速訪問的變量,比如計數器。還應注意的是,定義’register’並不意味着變量將被存儲在寄存器中,它意味着變量可能存儲在寄存器中,這取決於硬件和實現的限制。
static存儲類
static 存儲類指示編碼器在程序的生命週期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷燬。因此,使用static修飾局部變量可以在函數調用之間保持局部變量的值。
static 修飾符也可以應用於全局變量。當static修飾全局變量時,會使變量的作用域限制在聲明它的文件內。
全局聲明的一個static變量或方法可以被任何函數或方法調用,只要這些方法出現在跟static變量或方法同一個文件中。
實例:
#include<stdio.h>
/*函數聲明*/
void func1(void);
static int count = 10; /*全局變量 -static 是默認的 */
int main()
{
while (count--) {
func1();
}
return 0;
}
void func1(void)
{
/* 'thingy'是'func1'的局部變量 -只初始化一次
* 每次調用函數'func1''thingy'值不會被重置。
*/
static int thingy=5;
thingy++;
printf("thingy 爲 %d, count 爲 %d\n",thingy,count);
}
實例中count作爲全局變量可以在函數內使用,thingy使用static修飾後,不會在每次調用時重置。
extern存儲類
extern存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當使用extern時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
extern是用來在另一個文件中聲明一個全局變量或函數。extern修飾符通常用於當有兩個或多個文件共享相同的全局變量或函數的時候
第一個文件:main.c
#include <stdio.h>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二個文件:support.c
#include<stdioo.h>
extern int count ;
void write_extern()
{
printf("count is %d\n",count);
}
第二個文件中的extern關鍵字用於聲明已經在第一個文件main.c中定義的count。
算數運算符
+(加)、-(減)、*(乘)、/(除)、%(取模取餘)、++(自增,增加1)、–(自減)
a++
爲先賦值後運算 ++a
爲先運算後賦值
關係運算符
==、!=、<、>、>=、<=
邏輯運算符
&&:稱爲邏輯與運算符。如果兩個操作數都非零,則條件爲真
||:邏輯或運算符。如果兩個操作數中有任意一個非零,則條件爲真
!:邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件爲真則邏輯非運算符將使其爲假
位運算符
假設變量A的值爲60(00111100),變量B的值爲13(00001101),則:
運算符 | 描述 | 實例 |
---|---|---|
& | 按位與操作,按二進制位進行"與"運算。運算規則:0&0=0;0&1=0;1&0=0;1&1=1 | (A&B)將得到12,即00001100 |
l | 按位或運算符,按二進制位進行"或"運算。運算規則:`0 | 0=0;0 |
^ | 異或運算符,按二進制位進行"異或"運算。運算規則:0^0=0;0 ^1=1;1 ^0=1;1 ^1=0 | (A^B)將得到49,即00110001 |
~ | 取反運算符 | (~A)將得到-61,即爲11000011,一個有符號二進制數的補碼形式 |
<< | 二進制左移運算符。將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0) | A<<2將得到240,即11110000 |
>> | 二進制右移運算符。將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄 | A>>2將得到15,即00001111 |
賦值運算符
=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
雜項運算符
運算符 | 描述 | 實例 |
---|---|---|
sizeof() | 返回變量的大小 | sizeof(a)將返回4,其中a是整數 |
& | 返回變量的地址 | &a;將給出變量的實際地址 |
* | 指向一個變量 | *a;將指向一個變量 |
?: | 條件表達式 | 如果條件爲真?則值位X:否則值爲Y |
C中的運算符優先級
後綴:() [] -> . ++ --
從左到右
一元:+ - ! ~ ++ -- (type)* & sizeof
從右到左
乘除:* / %
從左到右
加減:+ -
從左到右
移位:<< >>
從左到右
關係:< <= > >=
從左到右
賦值:= += -= *= /= %= >>= <<= &= ^= |=
從右到左
C語言把任何非零和非空的值假定爲true,把零或null假定爲false
if語句 if…else語句 嵌套if語句
switch語句 嵌套switch語句
?:運算符(三元運算符)
輸入一個數字來判斷它是否爲奇數或偶數實例
#include<stdio.h>
int main()
{
int num;
printf("請輸入一個數字:");
scanf("%d",&num);
(num%2==0)?printf("偶數"):printf("基數");
}
return 0;
循環類型
while循環
while(condition)
{
statement(s);
}
for循環
for ( init; condition; increment )
{
statement(s);
}
do…while循環
do
{
statement(s);
} while (condition);
條件表達式出現在循環的尾部,所以循環中的statement(s)會在條件被測試之前至少執行一次
嵌套循環
循環控制語句
break語句
當break語句出現在一個循環內時,循環會立即終止,且程序流將繼續執行緊接着循環的下一條語句
它可用於終止switch語句中的一個case,如果時嵌套循環,break語句會停止執行最內層的循環,然後開始執行該塊之後的下一行代碼
continue 語句
告訴一個循環體立即停止本次循環迭代,重新開始下一次循環迭代
goto語句
將控制轉移到被標記的語句。但是不建議在程序中使用
*無限循環
如果條件用於不爲假,則循環將變成無限循環。for循環在傳統上可用於實現無限循環。由於構成循環的三個表達式中任何一個都不是必需的,可以將某些條件表達式留空來構成一個無限循環
#include<stdio.h>
int main()
{
for( ; ; )
{
printf("該循環會永遠執行下去!\n");
}
return 0;
}
可以按 ctrl+c 鍵終止一個無限循環