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

 

Exit mobile version