c++ c语言 - 数据类型
C 语法 - 数据类型
参考文献:
https://www.runoob.com/cprogramming/c-variables.html
https://www.cnblogs.com/codexlx/p/13394084.html
一、常量
-
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
# define hello "hello" //定义宏:定义语法#define 宏名 宏值
int a = 100; // 'a', -100, 3.14159
const int a = 1000; //被const修饰的变量变成只读,即变成常量
常量的使用(计算圆的周长与面积)
#include <stdio.h>
# define pi 3.141592
int main(void){
int r = 3;
float s = pi * r * r; //面积
float l = 2 * pi * r; //周长
// 并输出分别对第三第四位的四舍五入
printf("周长是:%.3f\n",l);
printf("面积是:%.4f\n",s);
return 0;
}
这里使用#define是定义了一个不可变的变量
二、变量与内存结构
会变化的数据,变量三要素:类型名、变量名、变量值:int r = 3;float s = 10.201;
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
定义语法:
类型名 变量名 = 变量值;
类型 | 描述 |
---|---|
char | 通常是一个字节(八位)。这是一个整数类型。 |
int | 对机器而言,整数的最自然的大小。 |
float | 单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。 |
double | 双精度浮点值。双精度是1位符号,11位指数,52位小数。 |
void | 表示类型的缺失。 |
1、变量的定义与声明
-
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
-
变量声明:用于向程序表明变量的类型和名字。(即没有变量值)
-
定义也是声明,extern声明 不是定义
-
定义也是声明:当定义变量时我们声明了它的类型和名字。 -
extern声明不是定义:通过使用extern关键字声明变量名而不定义它。 [注意]变量在使用前就要被定义或者声明。在一个程序中,变量只能定义一次,却可以声明多次。 定义分配存储空间,而声明不会。 -
C++程序通常由许多文件组成,为了让多个文件访问相同的变量,C++区分了声明和定义。 -
变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在程序中,变量有且仅有一个定义。 -
声明(declaration)用于向程序表明变量的类型和名字。定义也是声明:当定义变量的时候我们声明了它的类型和名字。可以通过使用extern声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。 -
extern声明不是定义,也不分配存储空间。事实上它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。 -
只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。 -
任何在多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
2、代码中区分定义与声明
1、extern通知编译器变量在其他地方被定义
extern告诉编译器变量在其他地方定义了。
extern int i; //声明,不是定义
int i; //声明,也是定义,未初始化2、带有初始化式的声明必定式定义
如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。
extern double pi=3.141592654; //定义
3、函数的声明和定义
函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。
extern double max(double d1,double d2); //声明
4、除非有extern关键字,否则都是变量的定义。
除非有extern关键字,否则都是变量的定义。若有extern描述,则声明永远无法提升为定义。
extern int i; //声明
int i; //定义
3、标识符
变量和常量的统称
命名规则
-
通常常量使用大写,变量使用小写,大小写严格区分 -
只能使用字母、数字、下划线,命名标识符,且数字不能开头。 -
禁止使用关键字和系统函数作为标识符名称,可以加下划线等进行区分
以下是合法的标识符:a, x, x3, BOOK_1, sum5
以下是非法的标识符:
3s 不能以数字开头 s* 出现非法字符* -3x 不能以减号(-)开头 bowy-1 出现非法字符减号(-)
三、数据类型
1、整型
名称 | 全称类型说明符 | 缩写类型说明符 | 位数 | 范围 |
---|---|---|---|---|
整型 | int | int | 16位 | -32768至+32767 |
无符号整型 | unsigned int | unsigned | 16位 | 0 至 65,535 |
短整型 | short int | short | 16位 | -32768至+32767 |
无符号短整型 | unsigned short int | unsigned short | 16位 | 0 至 65,535 |
长整型 | long int | long | 32位 | -2,147,483,648 至 2,147,483,647 |
无符号长整型 | unsigned long int | unsigned long | 32位 | 0至4,294,967,295 |
C语言中整型常量有三种不同的表示形式:
1、八进制整型常量:在八进制数值前面加前缀“0”,其数码取值为0~7。例如:054、0567、05421。
2、十六进制整型常量:前缀为“0X”或“0x“,其数码取值为0~9、A~F 或 a~f。例如:0X3D、0XE0、0xfff等。
3、十进制整型常量:既无前缀也无后缀。例如:254、745、890等。如将存储为long类型,需要在数字序列最后附一个字母L 或 l 作为后缀。例如:245L、7850L、124l等
int 是 C 语言的基本整数类型,可以满足我们处理一般数据的需求。C 语言还提供了四个可以修饰 int 的关键字:short、long、signed,以及 unsigned。利用这四个关键字,C 语言标准定义了以下整数类型:
1) short int(可简写为 short),和 int 一样,也是有符号整数
2) long int(简写:long),有符号整数
3) long long int(简写:long long),C99 标准添加的类型,有符号整数
4) unsigned int(简写:unsigned),无符号整数,不能表示负数
5) unsigned long int(简写:unsigned long),无符号整数,不能表示负数
6) unsigned short int(简写:unsigned short),无符号整数,不能表示负数
7) unsigned long long int(简写:unsigned long long),C99 添加的类型,无符号整数
8) 所有没有标明 unsigned 的整数类型默认都是有符号整数。在这些整数类型前面加上 signed 可以使读者更清楚地知道这些是有符号整数,尽管有没有 signed 都表示有符号整数。
例如:signed int 等同于 int 。一般我们把 short 称为短整型,把 long 称为长整型,把 long long 称为超长整型,把 int 称为整型。unsigned 打头的那些整数类型统称为无符号整型。例如:我们称 unsigned short 为无符号短整型。以此类推。
整数类型的选择如果要处理的只是非负整数,那么应该优先使用 unsigned 打头的那些整数类型。如果要处理的整数超出了 int 所能表示的范围,并且编译器中,long 的表示范围比 int 大,那就使用 long。不过,若非必要,尽量不要用 long,因为它可能会降低程序运行效率。有一点要注意:如果编译器中,long 和 int 都是 32 位的,并且需要使用 32 位整数,那么应该用 long,而不要用 int。只有这样,我们的程序才可以安全地移植到 16 位的计算机,因为 16 位的计算机中,int 一般也是 16 位的。类似地,如果需要使用 64 位整数,那就用 long long。如果 int 是 32 位的话,那么使用 short 可以节省空间,不过得确保要处理的整数不会超出 short 的表示范围。这种“节省”对内存大的计算机来说,是没什么意义的。
无符号整型
添加signed 有符号修饰符,通常不用
一般使用unsigned 无符号类型修饰符,即绝对值。(只表示量,而不表示方向)
在类型后面加 u 可以表示无符号类型:
unsigned int a = 10u;
unsigned long long b = 40LLu;
print("%u",a);
print("%llu",b); //不同格式化输出
格式化输出
打印格式 | 含义 |
---|---|
%hd | 输出short类型数据 |
%d | 输出int类型数据 |
%ld | 输出long类型数据 |
%lld | 输出long long类型数据 |
%hu | 输出unsigned short类型数据 |
%u | 输出unsigned int类型数据 |
%lu | 输出unsigned long类型数据 |
%llu | 输出unsigned long long类型数据 |
2、sizeof关键字(求类型大小)
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节。sizeof的返回值为size_t size_t 类型在32位操作系统下是unsigned int,是一个无符号的整数。返回一个%u接收的整数。
#include <stdio.h>
int main(void){
int a = 10;
short b = 20;
long c = 30;
long long d = 40;
printf("int 大小为:%d\n", sizeof(int));
printf("short 大小为:%d\n", sizeof(short));
printf("long 大小为:%d\n", sizeof(long));
printf("long long 大小为:%d\n", sizeof(long long));
printf("a 空间大小为:%d\n", sizeof(a));
printf("b 空间大小为:%d\n", sizeof(b));
printf("c 空间大小为:%d\n", sizeof(c));
printf("d 空间大小为:%d\n", sizeof(d));
return 0;
}
3、字符类型char
char是C/C++中的基本数据类型,可容纳单个字符的一种基本数据类型。
char占一个字节,也就是8个bit(二进制位),0000 0000 ~ 1111 1111,在无符号类型时char表示的范围是0~255,在有符号类型时char表示的范围是-128~127,可以表示256个整数。
char这种数据类型和其他的基本数据类型有所不同,char在标准中是unsigned,是有符号的,也就是有正负之分的,而其他的基本数据类型默认是signed无符号类型的。
字符类型里的整数被分成两组,每组128个:
其中的一组里的字符两种表示方式之间的对应关系在所有计算机上都是一样的,它们对应整数的范围从0到127。另一组里的字符两种表示方式之间的对应关系在不同的计算机上可能不一样,它们对应的整数范围可能从-128到-1也可能从128到255。字符类型(char)是整数类型,在内存单元中以整数形式存放。所以字符类型也可以进行运算。
注意char类型的数据仅仅只能容纳一个字符,它也是一种整型的另一种表达方式,符合ascii编码。
#include <stdio.h>
int main(void){
char ch = 'A';
printf("ch = %c\n", ch); //%c的格式化输出A
printf("ch = %d\n", ch); //%d的格式化输出A =》 变成整型数字
ch = 'B';
printf("ch = %c\n", ch); //修改参数
ch = 107;
printf("ch = %c\n", ch); //改成数字
// 其他特殊字符的一些ascii码的输出:
printf("'\\n'的格式化输出%\n",'\n');
printf("'\\0'的格式化输出%d\n",'\0');
printf("ascii = 16的格式化输出%c\n",16);
return 0;
}
可以知道char可以用ASCII码进行对应
参见百度百科:https://baike.baidu.com/item/ASCII/309296?fr=aladdin
4、转义字符
转义字符 | 意义 | ASCII 码值(十进制) |
---|---|---|
\a | 响铃警报(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 反斜杠 | 092 |
? | 问号字符 | 063 |
' | 单引号字符 | 039 |
" | 双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
\ddd | 八进制的任意字符,d范围为:0~7 | 三位八进制 |
\xhh | 16进制的转义任意字符,h范围为:0~9,a~f,A~F | 二位十六进制 |
5、浮点型(实型)
浮点数也称小数或实数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。这是常见的小数的表现形式,称为十进制形式。 C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。 在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值,例如7.0可能被储存为浮点值6.99999。
C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37。
double类型和 float类型的最小取值范围相同,但至少必须能表示10位有效数字。
long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。
float ——4字节 double ——8字节 long double ——8字节
浮点型的格式化输出
#include <stdio.h>
int main(void){
//浮点数格式化输出
float a = 10.234;
printf("%f\n",a); //默认为6位小数
printf("%6f\n",a); //6为占位符 ,右对齐
printf("%6.2f\n",a); //6为占位符,2为小数点后几位小数,右对齐
//科学赋值
double b = 3.2e3f;
double c = 3.1e-4f;
printf("%f\n",b);
printf("%f\n",c);
return 0;
}
图 | 郭嘉
文 | 郭嘉
扫码关注桔梗与少年
新浪微博:桔梗与少年