C語言學習筆記二—數據類型運算符與表達式
- 2020 年 7 月 25 日
- 筆記
一.C的基本語法單位
1.標識符:有效長度:31(DOS環境下)
2.關鍵字:main不是
3.分隔符:空格符,製表符,換行符,換頁符
4.注釋符:a./*…..*/ b.//
二.C的常用輸入/輸出函數
1.printf:
a.格式:
printf(“輸出格式”,輸出項序列)
例子:
printf(“%d”,5,6); //輸出結果為5,但格式錯誤,不建議這樣寫
類型 | 格式字元串 | 輸出形式 |
整型 |
%d %o %x或%X %u |
帶符號的十進位形式(正數不輸出符號+) 無符號的八進位形式(不輸出前導符號0) 無符號的十六進位形式(不輸出前導符號0x或0X) 無符號的十進位形式 |
浮點型 |
%f %e或%E %g或%G |
小數形式,默認小數位數為6位 指數形式,數字部分默認位6位 優化的小數或指數形式(去掉無意義的0後所佔寬度較水的1種) |
字元型 |
%c %s |
單個字元形式(不輸出『) 字元串(不輸出「) |
字元 | 功能 |
%md | …… |
%.nd |
對實數:指定小數點後位數(四捨五入) |
%-md | …. |
%+md | 指定在有符號數的正數前顯示+號 |
%0md | 輸出數值時指定左面的空位置自動填0 |
%#o %#x |
在八進位和十六進位數前顯示前導0,0x |
%ld %lf….. |
….. |
2.scanf:
註:
1.scanf可以指定輸入數據所佔有的列數,系統自動按他截取所需數據
如:scanf(」%3d%3d”,&a,&b);
輸入123456 —>a=123,b=456
2.如果在%後面有一個*附加符,表示本輸入項輸入後不傳給任何量
如:scanf(“%2d %*3d %2d”,&a,&b);
輸入:12 345 67 –>a=12,b=67
3.輸入數據時,不能規定精度
如:scanf(“%7.2d”,&a) ; ×
4.輸入字元時,每一個字元變數只能容納一個字元
如 scan(“%3c”,&a);
輸入:asc –>a=’a’;
3.getchar:
c=getchar();
4.putchar
putchar(c);
三.數據類型
1.基本數據類型
a.整型常量:BC中int的值域為-32768~32767
unsigned int : 0~65535
char: -128~127
unsigned char: 0~255
b.浮點型常量:
浮點數後綴:f/F,l/L.(浮點數總是有符號的,故無u或U後綴)
c.字元型常量: 分為轉義字元和普通字元
d.字元串常量:
e.符號常量
#define PI 3.14159
注釋:位,位元組,字長,字
位(Bit):電腦數據的最小單位,表示一個二進位數碼0或1.
位元組(Byte):八個二進位位構成1個位元組,一個位元組可以存儲一個英文字母或者半個漢字
字長:CPU在單位時間內能一次處理的二進位數的位數
字:8位CPU字長為8位,一個字=1個位元組,一次只能處理1個位元組,32位CPU字長為32位,一個字=4個位元組,一次只能處理4個位元組
四.運算符
1. 算術運算符:+,-,*,/,%
2.賦值運算符:=,複合賦值運算符:+=,-=,*=,/=,%=
3.關係運算符:<,>,<=,!=,==,>=
4.邏輯運算符:&&,||,!
例子:
int a,b,c; a=b=c=1; ++a||++b&&++c; printf("b=%d\n",b);
輸出:b=1
++a||++b&&++c; =======++a||(++b&&++c); 優先順序:&&>||
後面的邏輯表達式本來是先算&&再算||
但是最終還是算||,||中當左邊表達式為真時就不會計算右邊表達式
所以只運算++a,所以結果是a=2,b=1,c=1
5.自增自減:++,–
例子:
double b=1.25;
b++; ( √)
#define d 2
d++; (×)
6.條件運算符:? :
7.逗號表達式: , , , ,
8.位運算: &,|,^,<<,>>,~
五.類型轉換
1.自動類型轉換:
a.三種自動類型轉換的情況:
(1).當雙目運算符的兩個運算量結果的類型不相同且進行算術運算時
(2).當一個值賦予一個不同類型的變數時
賦值運算時的自動類型轉換(隱式轉換)
賦值轉換將右值表達式的結果的類型轉換成左值表達式的數據類型(強制性)
例子:
int a=8,b=5,c; c=a/b+0.4;
結果:c=1
(3).調用函數實現數據類型轉換
b.轉化規則:
值域較窄的類型向值域較寬的轉化
c.轉換方向圖:
short,char->int->unsigned->long->unsigned long->double->long double
↑
float
注意:故意轉換不安全
例子:1.5-7/2+4.3+5%2=1.5-3+4.3+1=3.8
2.強制類型轉換(顯式轉換)
a.一般形式: (類型名)表達式;
b.作用:將表達式轉換為類型名所指定的類型
例子:
float x=6.5;
int y=(int)x;
3.運算符的優先順序:
運算符的優先順序決定了運算順序,結合性決定了運算是從左到右還是從右到左。
優先順序:()>++ =– =! = ~ =單目+ =單目- = 強制類型轉換 =sizeof >”*,/,%” >”+ , -“> ” >>,<<” > “>,>=,< ,<=” > “==,!=” >& >^ > | > && > || > ? : >賦值運算符 > ,
關於BC中長整型的討論:
printf("%d\n",1*2*3*4*5*6*7*8); //輸出: -25216 %d改為%u : 40320 √
//另一種選擇 :
double j=1.0*2*3*4*5*6*7*8*9*10;
printf("%.0f",j);
//printf("%ld\n",1*2*3*4*5*6*7*8); ×
原因:
2 bytes : %d -32768~32767 %u 0~65535
40320<==>0x9d80<==> 1001 1101 1000 0000(-25216的補碼)
-25216<==> -110 0010 1000 0000
另一個錯例:
long j=1*2*3*4*5*6*7*8;
printf(“%ld”,j);
改進:
j=1*2*3*4*5*6*7*8(L);
or j=(long)1*2*3*4*5*6*7*8; 最實用
or printf(“%ld”,1*2*3*4*5*6*7*8L);