02-C语言-常量、变量、数据类型

一、关键字

  关键字是C语言系统保留的标识符。它在C程序中有自己的作用。
C语言常用关键字如下图:

image.png

二、数据类型

数据类型的作用:编译器预算对象(变量)分配的内存空间大小


image.png

三、常量

  • 在程序运行开始至结束都不会改变的量叫常量。
  • 常量一般出现在表达式或赋值语句中
常量 示例
整型(int)常量 100,200,-100,0
实型(float)常量 3.14 , 0.125,-3.123
字符型(char)常量 'a','b','1','\n'
字符串(char [])常量 "a","ab","12356"
符号常量 #define MAX 100

3.1 C语言中使用常量

  • const 数据类型 标识符 = 数据const 关键字修饰的数据。const修饰数据为只读模式。被const修饰的数据如果在后面发生修改程序编译出错。在C语言中const修饰的数据不安全,可以通过指针修改。
  • #define 标识符 数据 数据类型会根据标识符后面的数据编译器自动匹配。通过这种方法使用的变量不会被修改。

3.2 常量使用示例

#include <stdio.h>
#define MAX 100
int main(){
  const int a = 10; //整型常量。
  const float b = 3.14; // 实型常量
  const char c = 'A'; // 字符常量
  const char d[20] = "Hello World"; //字符串常量
  printf("a = %d\n", a); // 输出a=10
  printf("b = %f\n", b); // 输出b=3.14
  printf("c = %c\n", c); // 输出c='A'
  printf("d = %s\n", d); // 输出d="Hello World"
  printf("MAX = %d", MAX); // 输出MAX
  return 0;
}

3.3 标识符的命名规则

  • 由字母(A-Z,a-z)、数字(0-9)和下划线(_)组成
  • 数字不能用于标识符开头
  • 不能使用关键字作为变量名
  • C语言是大小写敏感的语言。同一个单词的字母大小写不同也是不同的标识符。

四、变量

  • 在程序运行过程中,其值可以改变
  • 变量在使用前必须先定义,定义变量前必须有相应的数据类型
  • 变量在编译时为其分配相应的内存空间
  • 可以通过其名字地址访问相应内存
  • 概念图
image.png

4.1 变量的声明与定义

  • 声明: 声明变量不需要建立存储空间 extern关键字只做声明。
    • 语法: extern 数据类型 标识符;
      • 标识符不能对其进行赋值,因为没有都其分配存储空间。
  • 定义: 声明变量需要建立存储空间
    • 语法: 数据类型 标识符[ = 数据];
      • 数据类型 标识符;: 定义一个变量,系统随机的为其赋值
      • 数据类型 标识符 = 数据;:定义一个变量,并初始化值。

一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。

4.2 变量使用实例

#include <stdio.h>
int main(){
  int a =10; // 定义一个变量a,并初始化为10
  int b; // 定义一个变量, 系统会随机的为变量赋值。
  printf("a = %d", a);  // 输出a = 10
  printf("b = %d", b);  // 输出b = ?
  a = 100;
  b = 4;
  printf("a = %d", a);  // 输出a = 100
  printf("b = %d", b);  // 输出b = 4
  
  extern int c;  // 声明一个变量
  c = 10; // 报错,编译不通过。声明的变量没有分配存储空间。不能进行赋值。
  return 0;
}

4.3 某个类型的变量

  • 定义某个类型的变量
    类型 变量名;: 在内存中开辟一块空间,并将这个空间命名为变量名
  • 对变量赋值
    变量名 = 值;: 将存放到以这个变量名为标识的内存空间。
  • 初始化某个类型的变量
    类型 变量名 = 值;: 在内存中开辟一块空间并为其命名,在将值存放到这个空间中。

定义变量和初始化变量


创建某个类型变量的示例

#include <stdio.h>
int main(){
  int a = 10; // 创建一个整型变量,并初始化
  float b = 3.14;  // 创建一个浮点类型变量,并初始化
  double c = 3.11;  // 创建一个双精度浮点型变量,并初始化
  char d = 'c'; // 创建字符型变量,并初始化
  return 0;
}

4.4 整型变量

整型 符号 占用空间
基本整型 int 4字节
短整型 short [int] 2字节
长整型 long [int] Windows系统4字节,Linux系统4字节(32位)8字节(64位)
超长整型 long long [int] 8字节

\color{#ff0000}{注意:}

  • 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能短于 int 类型。
  • 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。

[]里面的内容表示可以省略

4.4.1 整型数据符号修饰signed&&unsigned

  • signed: 表示有符号整型数据。C语言对于整型数据默认都是有符号的。即最高位为符号位;0表示正数,1表示负数。
  • unsigned: 表示无符号整型数据。将存放负数的内存用于存放正数。扩大内存存放数据的大小。
整型 符号
有符号基本整型 [signed] int
无符号基本整型 unsigned int
有符号短整型 [signed] short [int]
无符号短整型 unsigned short [int]
有符号长整型 [signed long [int]]
无符号长整形 unsigned long [int]
有符号超长整型 [signed] long long [int]
无符号超长整型 unsigned long long [int]

4.4.3 C语言中进制的表示

进制 描述
十进制 以正常数字1-9开头,如123
八进制 以数字0开头,如0123
十六进制 0x开头,如0x123
二进制 C语言不能直接书写二进制数据

4.4.2 整型数据的输入输出

输出

输入或输出格式 含义
%d 输出有符号10进制int类型数据
%o 输出8进制int类型数据
%x 输出16进制int类型数据,字母以小写输出
%X 输出16进制int类型数据,字母以大写输出
%u 输出无符号10进制int类型数据

示例

#include <stdio.h>
int main(){
  int a = 123;
  int b = 0123;
  int c = 0xabc;
  int d;
  printf("十进制 a = %d\n", a);
  printf("八进制 b = %o\n", b);
  printf("十六进制 c = %x\n", c);
  printf("输入数字d:\n");
  scanf("%d", &d);
  printf("输入的d = %d", d);
  return 0;
}

其他整型输出格式

输出格式 描述
%hd 输出short int整型数据
%ld 输出long int整型数据
%lld 输出long long int整型数据
%lu 输出unsigned long int整型数据
%llu 输出unsigned long long int整型数据

整型常量扩展

常量类型 表示
const long int 10l/10L
const long long [int] 10ll/10LL
const unsigned int 10u/10U
const unsigned long [int] 10ul/10UL
const unsigned long long [int] 10ull/10ULL

输出数据示例

#include <stdio.h>

int main(){
    short a1 = 10;
    int a2 = 10;
    long a3 = 10l; // 10L
    long long a4 = 10ll;  //10LL
    printf("sizeof(short): %lld B\tsizeof(int): %lld B\tsizeof(long): %lld B\tsizeof(long long):%lld B\n", sizeof(short),
           sizeof(int), sizeof(long), sizeof(long long));
    printf("short a1 = %hd\t int a2 = %d\t long a3 = %ld\t long long a4 = %lld\n",a1, a2, a3, a4);

    unsigned short b1 = 2u;
    unsigned int b2 = 10u;
    unsigned long b3 = 10ul;
    unsigned long long b4 = 10ull;
    printf("sizeof(unsigned short):%lld B\tsizeof(unsigned int):%lld B\tsizeof(unsigned long):%lld B\tsizeof(unsigned long long):%lld B\n", sizeof(unsigned short), sizeof(unsigned int),
           sizeof(unsigned long), sizeof(unsigned long long));
    printf("unsigned short b1 = %u\tunsigned int b2 = %u\tunsigned long b3 = %lu\tunsigned long long b4 = %llu\n", b1, b2, b3, b4);
  return 0;
}

4.5 字符变量

  字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。
  字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型

4.5.1 字符的输出

输出格式:%c

#include <stdio.h>
int main(){
  char ch = 'a';
  printf("ch = %c", ch);  // 以字符形式输出
  printf("ch = %d",ch);  // 以字符的ASCII编码输出
  return 0;
}

4.5.2 字符的输入

#include <stdio.h>
int main(){
  char ch;
  printf("输入一个字符:\n");
  scanf("%c", &ch);
  return 0;
}

4.5.3 ASCII码对照表

ascii码对照表

4.5.4 转义字符

转义字符 含义 ASCII码值(十进制)
\a 警报 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 数字0 000
\ddd 8进制转义字符,d范围0~7 3位8进制
\xhh 16进制转义字符,h范围0~9a~fA~F 3位16进制

4.6 数值溢出

 当超过一个数据类型能够存放最大的范围时,数值会溢出。
 有符号位与最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。

#include <stdio.h>

int main()
{
    char ch;

    //符号位溢出会导致数的正负发生改变
    ch = 0x7f + 2; //127+2
    printf("%d\n", ch);
    //  0111 1111
    //+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127

    //最高位的溢出会导致最高位丢失
    unsigned char ch2;
    ch2 = 0xff+1; //255+1
    printf("%u\n", ch2);
    //    1111 1111
    //+1后 10000 0000, char只有8位最高位的溢出,结果为0000 0000,十进制为0
    ch2 = 0xff + 2; //255+1
    printf("%u\n", ch2);
    //    1111 1111
    //+1后 10000 0001, char只有8位最高位的溢出,结果为0000 0001,十进制为1
    return 0;
}

4.6 浮点型变量

  实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。

类型 占用空间 有效数字 打印格式
float 4字节 7位有效数字 %f
double 8字节 15~16位有效数字 %lf

由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。

不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

使用示例

#include <stdio.h>

int main()
{
    //传统方式赋值
    float a = 3.14f; //或3.14F
    double b = 3.14;

    printf("a = %f\n", a);
    printf("b = %lf\n", b);

    //科学法赋值
    a = 3.2e3f; //3.2*1000 = 32000,e可以写E
    printf("a1 = %f\n", a);
    a = 100e-3f; //100*0.001 = 0.1
    printf("a2 = %f\n", a);

    a = 3.1415926f;
    printf("a3 = %f\n", a); //结果为3.141593
    return 0;
}

4.7 类型限定

限定符 含义
extern 声明一个变量,不会建立存储空间
const 定义一个常量,常量的值不能修改
volatile 防止编译器优化代码
register 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。

4.8 字符串常量

  • 字符串是内存中一段连续的char空间,以'\0'(数字0)结尾。
  • 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。

字符串常量与字符常量的不同:


image.png

每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',即 "a" 包含两个字符'a'和’\0’。

4.9 字符串格式化

printf格式字符

打印格式 对应数据类型 含义
%d int 基本整型
%hd short int 短整数
%hu unsigned short 无符号短整数
%o unsigned int 无符号8进制整数
%u unsigned int 无符号10进制正数
%x,%X unsigned int 无符号16进制整数
%f float 单精度浮点型
%lf double 双精度浮点型
%e,%E double 科学计数法表示的数
%c char 字符型
%s char [] 字符串
%p type * 以16进制形式输出指针
%% % 输出%

printf附加格式

字符 含义
l(L) 附加在d,u,x,o前面,表示长整数
- 左对齐
m 数据最小宽度
0 将输出的前面补上0直到占满指定列宽为止不可以搭配使用-
m.n m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。

4.10 输入&&输出

输出

函数 作用
printf() 格式化输出
putchar() 输出一个字符(一个char)
puts 输出一个字符串

输入

函数 作用
scanf("%类型格式", &标识符) 格式输入
getchar() 输入一个字符(一个char)
gets() 输入个字符串
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容