二、變量與基本數據類型(數字類型,字符類型)


一、變量與常量

1.1 常量

在程序執行過程中,其值不能被改變
常量一般出現在表達式或者賦值語句
利用const 修飾的變量為常量,不可修改
利用define定義的一般為常量,定義時候不需要分號
利用extern修飾的量知識聲明,而沒有定義,故沒辦法對其賦值

1.2 變量

1.2.1 變量的概念

變量相當於內存中一個數據存儲空間的表示, 可以把變量看做是一個房間的門牌號,通過門牌號就能找到房間。同樣的通過變量名我們就能訪問到變量的值。

可以簡單理解 y=x。未知數x就是變量,當x取值時,就是確定門牌號了,就能求出y的值,也就是能找到房間在哪了。

1.2.2 變量的使用

1. 聲明變量(定義變量)
2. 給變量賦值
3. 使用變量

1.3 變量的地址

/* 
1.取地址運算符   &

2.取變量地址     &a

3.輸出地址  
    printf("%p", &a);   // 0014ff20    %p,就是以地址形式(16進制)輸出
    printf("%#p", &a);  // 0x0014ff20  %#p,就是以地址形式輸出,加上前綴0x
*/

1.4 變量的輸入(scanf)

1.4.1 單個輸入

scanf("%d", &a);
/*
1、scanf()
2、%d 這個一定要跟變量a類型對應上
3、&a一定要加取地址\
4、回車結束輸入
*/
scanf("%f", &b);

1.4.2 多個輸入

/*
1. scanf("%d%d", &a, &b);  輸入兩個數的情況可以用空格隔開

2. 分隔符: 轉義字符中間用什么隔開,輸入的時候就用什么分開
    例如:scanf("%dasd%d", &a, &b); 控制台:12asd13 否則輸入第二個數據會失敗

3. 注意點
    1、scanf("%d%d\n", &a, &b);  不要加換行
    2、分隔符,一定要跟程序里一樣
    3、格式化字符%d 這個一定要跟變量a類型對應上
*/

二、數據類型

在我們的程序里,不同類型的數據,都對應自己的一種特有的數據類型,整數就是整型數據類型,小數就是浮點型數據類型,一句話叫字符型數據類型,等等

 

 

 

三、基本數據類型

3.1 整型(int)

3.1.1 整型的輸出

整型:就是整數, 5, -10, 0, 520, 1314, 77, 331
我們寫個整數,默認就是int類型的數據,或者說計算機就會以int類型來處理它

 

// 整型的輸出
#include <stdio.h>
int main(void) {
    printf("%d\n", 12); // %d 代表整型,格式化輸出符號, 以10 進制整型形式輸出
    printf("%o\n", 12); // %o  以8 進制整型形式輸出        14
    printf("%x\n", 12); // %x  以16 進制整型形式小寫輸出    c
    printf("%X\n", 12); // %X  以16 進制整型形式大寫輸出    C
    return 0;
}

問題:如果我們需要的是另一個數,這樣的話上面的輸出每一個12都需要修改,這樣就很麻煩了。

3.1.2 聲明一個整型變量

我們測試的是一個12,如果位數比較多,比如1873426,這個數不好記。如果這個數使用次數、位置很多,使用它計算的時候,根本記不住,還容易寫錯。

可以定義一個整型的變量,來裝這個數。

int a = 1873426;
/*
定義一個int型變量,變量名字是a,並將1873426賦值給a
a是變量名: 盡量不要用中文, 名字盡量用英文,英文的個數不限制
= 叫賦值運算符,作用是將1873426賦值給a這個變量
等於號兩端的空格 為了美麗。
1873426: 數據的類型要跟變量的類型對應
*/
// 1、然后使用這個數的時候就用a來代替,既方便又准確
// 2、哪天想換數據了,直接改一個位置int a = 126;就行了
// 其他聲明與賦值方式
int a;  //沒有初始值
a = 123; // 給變量賦值
int b = a;

b = a = 14; // 從右往左賦值
// 1. 聲明 二進制 (二進制由 0 和 1 兩個數字組成,使用時必須以0b或0B(不區分大小寫)開頭)
int a = 0b101;  //換算成十進制為 5
int b = -0b110010;  //換算成十進制為 -50
int c = 0B100001;  //換算成十進制為 33

// 2. 聲明 八進制 (八進制由 0~7 八個數字組成,使用時必須以0開頭(注意是數字 0,不是字母 o))
int a = 015;  //換算成十進制為 13
int b = -0101;  //換算成十進制為 -65
int c = 0177777;  //換算成十進制為 65535

// 3. 聲明 十六進制 (十六進制由數字 0~9、字母 A~F 或 a~f(不區分大小寫)組成,使用時必須以0x或0X(不區分大小寫)開頭)
int a = 0X2A;  //換算成十進制為 42
int b = -0XA0;  //換算成十進制為 -160
int c = 0xffff;  //換算成十進制為 65535

3.1.3 有無符號整型

  寫法 表示范圍 內存大小 輸出方式
有符號 signed int (簡寫 int) -2^31~2^31-1 (-2147483648~2147483647) 4Byte %d
無符號 unsigned int 0~2^32-1 (0~‭4294967295‬) 4Byte %u(%u表示無符號十進制整型的輸出)

3.1.4 其他整型

 

  short (int) int long(int) long long (int)
中文名 短整型 整型 長整型 長長整型
占用字節 2 4 8 (只規定long不小於int的長度) 8
無符號范圍 unsigned short(0~2^16-1) unsigned(0~2^32-1) unsigned(0~2^64-1) unsigned long long int(0~2^64-1)
有符號范圍 signed short(-2^15~2^15-1) signed(-2^31~2^31-1) signed-2^31~2^31-1 signed long long int(-2^63~2^63-1)
輸出格式 %hd %d %ld %lld

// 二進制數、八進制數和十六進制數的輸出

  short int long
八進制 %ho %o %lo
十進制 %hd %d %ld
十六進制 %hx %hX %x %X %lx %lX
#include <stdio.h>
int main()
{
    short a = 0b11111111;  //二進制數字 255
    int b = 0377;  //八進制數字  255
    long c = 0xff;  //十六進制數字 255
   
    printf("a=%ho, b=%o, c=%lo\n", a, b, c);  //以八進制形似輸出
    printf("a=%hd, b=%d, c=%ld\n", a, b, c);  //以十進制形式輸出
    printf("a=%hx, b=%x, c=%lx\n", a, b, c);  //以十六進制小寫形式輸出
    printf("a=%hX, b=%X, c=%lX\n", a, b, c);  //以十六進制大寫形式輸出
    return 0;
}

 

3.2 浮點型(實型) (float, double,long double)

3.2.1 小數的表示方式

// 1.十進制形式 小數分為整數部分和小數部分,它們由點號.分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的小數,這是最常見的小數形式。

// 2.指數形式: 例如 7.25×10^2、0.0368×10^5、100.22×10^-2、-27.36×10^-3 等。任何小數都可以用指數形式來表示。

// C語言中小數的指數形式為:aEn 或 aen a 為尾數部分,是一個十進制數;n 為指數部分,是一個十進制整數;E或e是固定的字符,用於分割尾數部分和指數部分。整個表達式等價於 a×10^n。 2.1E5 = 2.1×10^5,其中 2.1 是尾數,5 是指數。520e1314 = 520x10^1314

3.2.2 浮點型的輸出

C語言中常用的小數主要有兩種類型,分別是 float 或 double;float 稱為單精度浮點型,double 稱為雙精度浮點型。

不像整數,小數沒有那么多幺蛾子,小數的長度是固定的,float 始終占用4個字節,double 始終占用8個字節。

long double 幾乎用不到。暫時只要知道有這個就行了,需要的時候再查。

  占用字節 十進制輸出 指數小寫輸出 指數大寫輸出
float 4 %f %e %E
double 8 %lf %le %lE
#include <stdio.h>
#include <stdlib.h>
int main()
{
    float a = 3.31;
    double b = 20.21;
    float c = 12E3;
    float d = 1.23456789;
    
    printf("a的十進制 = %f\n", a);      // a的十進制 = 3.310000 
    printf("a的指數小寫形式 = %e\n", a);// a的指數小寫形式 = 3.310000e+00
    printf("a的指數大寫形式 = %E\n", a);// a的指數大寫形式 = 3.310000E+00
    
    printf("b的十進制 = %lf\n", b);     // b的十進制 = 20.210000
    printf("b的指數小寫形式 = %le\n", b);// b的指數小寫形式 = 2.021000e+01
    printf("b的指數大寫形式 = %lE\n", b);// b的指數大寫形式 = 2.021000E+01
    
    printf("c的十進制 = %f\n", c);      // c的十進制 = 12000.000000
    printf("c的指數小寫形式 = %e\n", c);// c的指數小寫形式 = 1.200000e+04
    printf("c的指數大寫形式 = %E\n", c);// c的指數大寫形式 = 1.200000E+04
    
    printf("d的值是%f\n", d);          // d的值是1.234568
    
    printf("%d\n", sizeof(3.31)); // 8
    printf("%d\n", sizeof(3.31f)); // 4, f/F
    printf("%d\n", sizeof(3.31l)); // 16  l/L
    printf("%d\n", sizeof(a)); // 4
    printf("%d\n", sizeof(b)); // 8
    printf("%d\n", sizeof(c)); // 4
    printf("%d\n", sizeof(d)); // 4
    
    return 0;
}

/*
浮點型數字默認都是 double 類型的。
將 3.31 賦值給 a,必須先從 double 類型轉換為 float 類型,而將 20.21 賦值給 b 就不用轉換了。如果不是對應的,會涉及到類型轉換,類型轉換的結果可能會造成內存截斷,導致數據不是我們想要的,所以需要盡量保持一致.保持一致的方法就是后面加上 f, F, l, L。
*/

對於類似 %8.2f這樣的數據
8 代表一共所占的位數,小數點算一位。位數不夠,默認右對齊,前面空出來
. 代表小數點
2 代表小數點后面保留2位
08 0代表不夠左側補零
- 代表左對齊,右側空出來。

 

3.3 字符型 (char)

我們屏幕上出現的所有數字,漢字,符號都是 字符

我們使用的字符分成三類
  asc2碼字符(asc2碼表)
  拓展asc2碼(制表符)
  寬字符(漢字、特殊字符)

 

 

3.3.1 聲明一個字符

char c;
c = 'a';

char a = 'b';

printf("%c\n", a); // 'b'
printf("%d\n", a); // 98

// 加單引號才表示是字符a
#include <stdio.h>
int main(void)
{
    char a = 'A';
    printf("%d\n", a+1); // 66
    printf("%c\n", a+1); // B
    return 0;
}
/*
1個字節, sizeof(char)  sizeof(c)

表示范圍:
    有符號: -128 ~ 127  -2^7 ~ 2^7-1
    無符號: 0 ~ 255     0 ~ 2^8-1
    256個數
*/

#include<stdio.h>

int main(void)
{
    char c; // 聲明字符變量
    c = 'A';
    printf("%d, %d\n", sizeof(c), sizeof(char)); // 1, 1

    return 0;
}

3.3.2 字符輸出

// 1. 方式一
char a;
printf("%c\n", a); 

// 2. 方式二
putchar("a");

3.3.3 字符輸入(scanf)

3.3.3.1 輸入緩沖區問題

控制台輸入的原理: 我們在控制台的輸入,包括空格回車這些,系統會開辟一塊空間(輸入緩沖區)存儲我們的所有輸入,當我們按下回車時,表示輸入結束,此時,由輸入函數在緩沖區依次取數據,存入變量空間

char c, a, b;
scanf("%c", &c);
scanf("%c%c", &a, &b); // 中間不能加空格,逗號之類的。因為空格逗號會被認為成是一個字符被輸入了。

// 此時,第一次輸入后,輸入緩沖區留下一個回車字符,這個會被讀入c。 只要緩沖區有東西,那么遇到scanf就會自動讀取

// 輸入字符容易被緩沖區存留的內容影響,所以,在輸入字符前,我們把緩沖區清空,就可以去掉影響了。

 

#include<stdio.h>

int main(void)
{
    int d,c,e;
    scanf("%d", &d); // 12 23 34 45 
    scanf("%d", &c);
    printf("%d,%d\n",d,c); // 12 23
    scanf("%d", &e);
    printf("%d\n",e); // 34
    return 0;
}

3.3.3.2 處理輸入緩沖區

// 如何清空輸入緩沖區?
setbuf(stdin, NULL);  // 非C語言標准,有的編譯器不支持
fflush(stdin);
while((c = getchar()) != '\n' && c != EOF); // 通用
#include<stdio.h>

int main(void)
{
    int d;
    char c;
    scanf("%d", &d);
    setbuf(stdin, NULL); // 也可以scanf("%c", &c);先接受回車,然后在接受數據覆蓋掉原始回車。 
    scanf("%c", &c);
    printf("%d,%c\n",d,c);
    
    return 0;
}

3.3.3.3 scanf_s

// 讀數值型變量沒問題,讀字符形需要多加一個參數
scanf_s("%c", &c, 1)
// 這個1指示c的字節數

// 后面讀字符串也要注意
char str[10];
scanf_s("%s", str, 9);
#include<stdio.h>

int main(void)
{
    char c;
    char s[10]; 
    scanf_s("%c", &c,1); // 1代表輸入一個字符 
    printf("%c\n", c);    
    scanf_s("%s", s, 9);    
    return 0;
}

3.3.3.4 getchar()

// // 一次從輸入的緩存中讀取一個字符(回車也算),多余的放在緩存中
#include<stdio.h>

int main(void)
{
    char c;
    c = getchar();
    printf("%c\n", c);
    c = getchar();
    printf("%c\n", c);
    return 0;
}

 

// 清空緩沖區
#include<stdio.h>

int main(void)
{
    char c;
   
    c = getchar();
    printf("%c\n", c);
    while ((c = getchar()) != '\n' && c != EOF);  // EOF結尾的意思 , 和下面的while循環一個意思
    char d;
    scanf("%c", &d);
    printf("%c\n", d);
//    while(1)
//    {
//        char c1;
//        c1 = getchar();
//        if ('\n' == c1 || c1 == EOF)
//        {
//            break;
//        }
//    }
    return 0;
}

3.3.3.5 _getchar()

// 隨輸入 隨讀取,不需要回車確認,控制台不顯示.輸入一個讀取一個
// 頭文件是 conio.h

#include<stdio.h>
#include<conio.h>
 
int main(void)
{
    char c;
    c = _getch();
    printf("%c\n", c); // 輸入的內容直接存入緩沖區去了,如果沒有printf,那么在控制台上就看不到自己輸入的內容
    return 0;
}

3.3.3.6 數字與數字字符

#include<stdio.h>
#include<conio.h>
 
int main(void)
{
    printf("%d,%d",1,'1');  // 1,49
    return 0;
}

3.3.3.7 大小寫轉換

在 ASCII 表中, 大寫字母的范圍是[65, 90], 小寫字母的范圍是[97, 122]。所以大寫字母 +32 就是對應的小寫字母。小寫字母 -32 就是對應的大寫字母。

#include<stdio.h>
 
int main(void)
{
    char c = 0;
    while(1)
    {
        scanf("%c", &c);
        if (c >= 65 && c <= 90) // 大寫字母 
        {
            printf("%c",c+32); 
        }
        else if(c >= 97 && c <= 122) //小寫字母 
        {
            printf("%c", c-32); 
        }
        else if( c == '\n')
        {
            break; 
        } 
    }
}

3.3.4 轉義字符

3.3.4.1 認識轉義字符

轉義字符 \

轉義字符
意義
ASCII碼值(十進制)
\a
響鈴(BEL)
007
\b
退格(BS) ,將當前位置移到前一列
008
\f
換頁(FF),將當前位置移到下頁開頭
012
\n
換行(LF) ,將當前位置移到下一行開頭
010
\r
回車(CR) ,將當前位置移到本行開頭
013
\t
水平制表(HT) (跳到下一個TAB位置)
009
\v
垂直制表(VT)
011
\\
代表一個反斜線字符''\'
092
\'
代表一個單引號(撇號)字符
039
\"
代表一個雙引號字符
034
\?
代表一個問號
063
\0
空字符(NUL)
000
\ddd
1到3位八進制數所代表的任意字符
三位八進制
\xhh
十六進制所代表的任意字符
十六進制

 

 3.4 字符串類型

https://www.cnblogs.com/wangyong123/articles/13975849.html#_label3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM