二、变量与基本数据类型(数字类型,字符类型)

一、变量与常量

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)intlong(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

// 二进制数、八进制数和十六进制数的输出

 shortintlong
八进制 %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

posted on 2020-11-08 19:43  软饭攻城狮  阅读(994)  评论(0编辑  收藏  举报

导航