1. 程式人生 > 實用技巧 >C語言學習筆記二---資料型別運算子與表示式

C語言學習筆記二---資料型別運算子與表示式

一.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);