您好,登錄后才能下訂單哦!
簡單來說什么是C語言,就是用c寫的語言就是C語言。接下來言歸正傳。
1.沒有注意數據類型存儲范圍
int main(int argc, char **argv)
{
char a;
a = 1;
for (a=0; a<128; a++)
printf("#");
return 0;
}
你猜是循壞了128,還是死循環呢? 答案是死循環,因為a的類型是有符號char型,它的取值范圍為-128-127;當a=127時,a<128,會繼續執行,代碼執行完之后a會加1,但是a的最大值為127,在加1就會變成最小值-128,為什么會變成-128呢,就是我們平時的時鐘,時間為12:59時,再過一分鐘就會變成1點,這就簡單的說明了為最大值加一會變成最小值,最小值減1就會變成最大值。在計算中數據都是以2進制進行存儲的,127在計算機存儲時為0x7f,加1,就會變成0x80,因為char中0x80表示最小值-128;所以-128小于128,以此類推,a<128;永遠為真。
2.打印類型時,選擇正確的格式。
例如 double a = 4.5;
printf("%lf",a);
一定不能使用%f打印,否則會報警告
小結:只要時double ,long類型的數據打印時別忘了加上l
3.顯示無符號整數
%u:顯示無符號整數
%o:顯示無符號八進制
%x:顯示無符號16進制
4.各種數據類型的變量與0進行比較正確的書寫方式
int a=5;
if (0 == a);
char ch = 'a';
if ('\0' == char)
float f =0.152;
if ((x>-0.000 001) && (x<0.000 001))
bool flag = 1;
if ( flag )
int *p = &a;
if ( NULL == p)
5.轉義字符:轉移字符是一種特殊的字符常量,轉移字符常以反斜線"\"開頭
常用的轉移字符:
\a:蜂鳴,響鈴
\b:回退:向后退一格
\f:換頁
\n:換行:光標到下行行首
\r:回車,光標到本行行首
\t:水平制表符
6.調試代碼有很多中一般分為printf調試,bug調試等、
我要講的是用printf調試,這種方式方便簡單易操作。
利用FILE,LINE,FUNCTION,DATE,
TIME實現代碼跟中
FILE:顯示代碼的文件名;
FUNCTION:顯示調用函數的名稱,沒有默認為主函數
LINE:顯示所在的行數;
TIME:顯示時間
DATE:顯示日期
7.數據類型的轉換
在多種數據類型混合運算時,系統一般自動完成類型轉換
轉化的規則:存儲長度較短的轉化成存儲長度較長的,并且不丟失
(a)自動轉換 :
int a=5; double d = 4.5;
a + d ;結果是double類型的
(b)賦值轉換
int a=5; double d = 4.5; char ch;
ch = a + d ;結果是char類型的
(c)強制轉換
a = (int ) d + c;
字符型數據賦值給整型變量時,將字符數據放到整型變量存儲單元的低八位中
--對于無符號類型,則將字符的8位放到整型變量低八位中,高24位補零
--對于有符號字符類型,若最高位為0,整型變量高24為補0,若字符最高位為1 ,則高24位補1
char 0000 0001 --> 0000 0000 0000 0000 0000 0001
1111 1111 --> 11111 1111 1111 1111 1111 1111
將一個整型數據賦值給一個char類型變量時,直接將其低八位原封不動的送到char型變量(即截斷),精度會丟失。
將整型數據賦給浮點型變量時,數值不變,但以浮點型形式存放到變量中精度可能丟失;
將浮點型數據賦給整型數據,直接將浮點型數據存放到int類型存儲空間中;
將浮點型賦給double類型數據,直接將30--22位放到double類型62--52中,其他的放到剩下51位中,
將double類型數據賦給float類型,直接將取7位有效數字放到浮點型存儲空間中。
8.運算符
運算符是非常常見的,無論你用那種語言寫編程都會用到運算符,談到運算符,就會想到他的優先級,這里我們不講他的優先級,直降容易出錯的地方。
優先級:不是誰的優先級高就先算誰,所謂的優先級就是結合型,誰的優先級高就和誰結合,至于知怎算個的要根據優先級運算順序,相同的優先級運算順序時由編譯器決定的
(a) ++、 --
a++:就是獻給狀態值a;然后自行加一
++a; 先自加一,再給a+1的狀態結果;
-- a ; a++ 同理
(b) 不要對同一個變量,在一個表達式多次賦值
例如: a = 5;
c = a++ + a++ + a++; //編譯器不知道從那邊開始算
a = 5;
a = a++;同理
printf("%d %d %d %d %d\n", a++, a++, a++, a++, a++);
你要想這么做,就把a++ 結果賦值給其他變量,用其他變量進行計算
(c) 位移(只能用于整數或者字符型)
無符號數據類型:右移時左邊高位補0;左移時右邊補0;
有符號:正數:右移時,左邊補0;左移時右邊補0;
負數:右移時,左邊補1;左移時,右邊補0
對于正數右移一位相當于除以2,左移1位相當于乘以2;
(d)邏輯運算符
& | ^
& :兩者都是1,才為1,否則位0; 功能置零
| :兩者只有要一個為1,結果為1,否則為0, 功能置一
^ : 相同為假,不同為假, 功能取反
舉例: & A & 1 = A ; A & 0 = 0
| A | 1 = 1; A | 0 = A;
^ A ^ 1 = ~A ; A ^ 0 = A;
(e) 條件運算符:三目運算符
表達式1 ? 表達式2 : 表達式3
條件運算符運算有先后順序的:先算表達式1,若表達式1為真,算表達式2,結束,否則,計算表達式3,算完結束
例題: a = b=c= 1;
x = a++ ? b++ ?c--:c++:b--?c++:c--;
結果為:a=2;b=2,c=1;
(f)逗號運算符
優先級最低,將兩個表達式鏈接起來,從左往右以此計算、
注意:并不是任何地方的出現的逗號都是逗號運算符,例如函數參數,也是用逗號來間隔的
9.scanf和printf函數:
scanf:
修飾符 功能
m :輸ru數據寬度,遇到空格或不可轉換字符結束
* :抑制符,指定輸入項讀入后不賦給變量
輸入分割符的指定:
一般以空格、TAB或回車鍵作為分隔符
其他字符作分割符:格式串中兩個格式符間字符
例題:scanf("%d,%d,%d",&a,&b,&c);
輸入方式必須以:12,13,14回車
scanf("%d ",&a);
輸入 12 12回車才能結束否則不結束 過濾分割符,要輸入兩次
scanf("a=%d",&a);
輸入:必須以“a=”開頭+數字+回車 結束
scanf("%*4d",&a);
輸入:132345 a=45;
scanf("%d%c",&a,&c);
輸入 12回車 就結束了 因為%c會自動讀取回車、空隔
char ch;
int i;
for (i=0; i<10; i++)
{
printf("i=%d\n",i);
scanf("%c",&ch);
printf("%c\n",ch);
getchar(); //表示取走回車鍵,只能取走一次
}
%s he %c 遇到空格,回車鍵就自動停止
scanf("%[^\n]",&a);//表示不取空格鍵
scanf("%[a-z]",&a);//表示只取a-z
10.switch:
是一種多路判斷語句,他判斷表達式置是否與整型或字符常量例表中的某個值相匹配,若找到了相應的匹配,就會執行與常量關聯的語句,switch,case,和default都是關鍵字。語句可以時簡單或符合語句。
switch后面只需要用圓括號括起來,而且switch的主題用{}括起來,計算表達式的數據類型與指定case常量數據類型匹配
switch后的表達式可以包含任何變量名,也可以時常量
case后面只能時常量(整型和字符型)
case后面長量不能為相同,可以不按照順序,不影響程序結果,但是一般時按照順序。
case 后面不加break,則表示找到匹配之后往下執行,如果沒有遇到break;會執行到程序結束,
default:是說明沒有匹配的選項進行說明,放到開始位置要加上break,否則會繼續執行,放到末尾,就不用加了,執行玩后就結束了
例如:case 5: 語句 ;break;
case 5: 語句;break; //錯誤,有兩個相同的case,因為在匹配中不知道該選則那個,
case 1: 語句 ;break;
case 7 || 6: 語句;break; //錯誤7 || 6 返回狀態結果為1,與case 1:重復 ,但是你可以這樣寫 case 6: case 7: 語句;break;
last :一維數組和二位數組
講數組,就要集合,什么集合,就是把相同的東西放在一起。對于數組呢?也是一樣的,就是把相同的類型的數據放在一起,如果不用一個數組來存放相同數據,用變量來表示,就會顯得雜亂無章,沒有條例性,時間久了,只有上帝知道,你所定義變量的含義了;接下來正式介紹數組
《存儲類型》 《數據類型》 變量名 [元素個數] //數組實際是由 元素數據類型+[元素個數]組成
存儲類型:說白了就是你定義了變量存放的位置。(一般默認auto,放在棧中,當代碼塊執行結束就是放空間,static 為靜態類型,放在靜態取,用static定義數據存儲類型,知道程序結束才釋放空間,否則不釋放空間,extern聲明為全局變量,可以使用其他文件用extern聲明的變量,作用范圍用于整個函數,register修飾符暗示編譯程序相應的變量將頻繁的使用,如果可能話應將放在CPU寄存器中,以加快其存儲速度)
int a[5]; //a實際可以看成 int [5] ;類型
//數組的大小在編譯的時候確定,而變量在運行時才有值
//數組元素個數必須為整型或char類型
初始化:定義同時對變量或數組元素賦值
int a[3] = {1,2,3}; //全部初始化.
char ch[5] = {65,66,67}; //沒有初始化的部分自動清0
int be[100] = { [95] =15,} ; //指定元素初始化,沒有初始化的部分自動清零
int c[6];
c[2] = 2; //對元素賦值,不會影響其他元素,不對數組初始化,起內存的存放的值是未知的,不對數組進行越界檢查,對于越界的元素訪問可能造成不可預知的錯誤;
int cat[9];
cat[2] = 5; //[ ] 數組定義固定格式
2[cat] = 5; //引用變量時,[ ] 時變址運算符 a[i] == (a+i) == (i+a) == i[a];
數組名的含義:
#define N 10
int a[N];
1.代表整個數組:只有子啊&a,和sizeof(a)
&a得到的是整個數組地址
sizeof(a)得到整個數組的字節大小
2.其他情況數組名代表第一個元素的地址 即 a + 0 == &a[0], sizeof(a+0); 代表第一個數組元素的地址,是一個地址常量,不可以自加,不可以對數組名進行賦值
a++; //錯誤
a = {1,23,5};//錯誤
int a[0]; 表示是一個地址,不能存放數據
3.數組遍歷
int a[10]= {0};
int i;
for (i=0; i<10; i++)
{
printf("%d\n",a[i]);
}
4.int a[4] ;//數組在編譯時,空間就已經確定了,變量在執行的時候才申請空間賦值
二維數組:其實是由一維數組組成的,內存存儲空間時線性。
int a[] [5]; //可以省略一維數組的下標;
初始化:
int a[5][5]= {15,6,3,9,7,8,2,1,5,4,6};//部分初始化,其他都清0;
int c[8][9] = { [6][3]=9,};指定元素初始化,先定行,再指定行中的某一個
二維數組名的含義:
1.數組名:
sizeof(數組名) ==>整個數組大小
&(數組名) ==> 整個數組地址
2.對于二維數組來說。每一個元素都是一個一維數組,數組名中放在第一個一維數組地址&a[0] ,除了上面的情況,都是代表了&a[0] 即 a == &a[0];
int a[M][N];
例如: sizeof(a) == 4*M*N;
sizeof(a[0]) == 4*N;
sizeof(a[0][0]) == 4;
遍歷:
#define M 4
#define N 5
int main(int argc,char **argv)
{
int a[M][N]={0};
int i,j;
for (i=0; i<M; i++)
{
for (j=0; j<N; j++)
printf("%d\t",a[i][j]);
printf("\n");
}
return 0;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。