文章目录
常量与变量
C的关键字共有32个
常量
在程序运行过程中其值不能发生改变的量,称为常量。
定义常量:
- 使用const 数据类型 常量名=值 (不安全)
const float pi = 3.14159;
- 使用宏定义常量:#define 常量名 值
#define PI 3.14159 //无等号,无分号
变量
在程序运行过程中其值可以改变的量,称为变量。
定义格式:
数据类型 变量=值
在定义局部变量时,可以在数据类型前加auto(一般不加)
int weight = 5;
标识符命名规则:
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 标识符中字母区分大小写
- 要见名知意 如:RoleLv role_lv(驼峰式命名)
使用示例
例一:
#include<stdio.h>
int main(void)
{
//黄瓜3元/斤,购买5斤
//常量:在程序运行过程中其值不能发生改变的量,称为常量。
const int price = 3;//使用const定义常量
//变量:在程序运行过程中其值可以改变的量,称为变量。
int weight = 5;
int sum = price * weight;
printf("%d\n", sum);
return 0;
}
结果:
15
例二:
#include<stdio.h>
//宏定义常量
#define PI 3.14159
int main()
{
//圆的面积:s=pi*r*r
//圆的周长:c=2*pi*r
//常量 pi
//const float pi = 3.14159;
float r = 3.2;
float s = PI * r*r;
float c =2* PI * r;
//占位符 %f表示输出一个浮点型float 默认保留6位小数
printf("圆的面积:%f\n", s);
printf("圆的周长:%.2f\n", c);//.2表示保留2位小数,会四舍五入
return 0;
}
结果:
圆的面积:32.169884
圆的周长:20.11
基本类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
整型:int
整型变量的定义和输出
整型变量的输入
在使用键盘进行输入时需要使用scanf,但由于用户输入的问题会引起安全警告。
scanf安全问题解决:
#define _CRT_SECURE_NO_WARNINGS//需放在整个程序的首位
或者
#pragma warning(disable:4996)//放在程序的任意位置
示例:
//#define _CRT_SECURE_NO_WARNINGS//消除由于scanf引起的警告
#include<stdio.h>
#pragma warning(disable:4996) //或者使用此预处理命令约束警告 ,可以放在程序的任何位置
int main(void)
{
int a;
scanf("%d", &a);//通过键盘输入赋值,&运算符表示取地址运算符,其后不加"\n"
printf("%d\n", a);
return 0;
}
结果
123
123
整型的大小和范围
sizeof关键字
- sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
- sizeof的返回值为size_t
- size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
示例:
#include<stdio.h>
int main(void)
{
int a = 10;//整型变量
short b = 20;//短整型
long c = 30;//长整型
long long d = 40;//长长整型
//short<=int<=long<long long
printf("%d\n", a);
printf("%hd\n", b);//占位符表示输出一个短整型数据
printf("%ld\n", c);//占位符表示输出一个长整型
printf("%lld\n", d);//占位符表示输出一个长长整型
//sizeof 计算数据类型在内存中占的字节(BYTE)大小
1B=8bit
/*sizeof(数据类型)=sizeof(变量名)*/
unsigned int len = sizeof(int);
/*printf("%u\n", len);*/
printf("整型:%d\n", sizeof(a));//4=32bit
printf("短整型:%d\n", sizeof(b));//2
printf("长整型:%d\n", sizeof(c));//4
printf("长长整型:%d\n", sizeof(d));//8
return 0;
}
结果:
10
20
30
40
整型:4
短整型:2
长整型:4
长长整型:8
字符型 char
字符变量的定义和输出
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。
示例:
#include<stdio.h>
int main(void)
{
//字符类型变量
char ch = 'a';
//打印字符变量
printf("%c\n", ch);
//打印字母a对应的十进制数
printf("%d\n", ch);
//打印字符型的大小
printf("字符型大小:%d\n", sizeof(ch));
return 0;
}
结果:
a
97
字符型大小:1
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
示例:
#include<stdio.h>
int main(void)
{
char ch1 = 'a';
char ch2 = 'A';
printf("%d\n", ch1 - ch2);//输出的为其ASCII码相减后的结果
return 0;
结果:
32
字符型的输入
使用scanf输入
scanf("%c", &ch);
示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
char ch;
printf("请输入字符:%c\n");
scanf("%c", &ch);
printf("%c\n", ch-32);
return 0;
}
结果:
请输入字符:\
a
A
转义字符
浮点型
浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
示例:
#include<stdio.h>
int main(void)
{
float a = 3.14f;
double b = 3.14;
printf("%.2f\n", a);
printf("%f\n", b);
//sizeof字节大小
//浮点型数据,存储在内存中的格式分为符号位、指数位、小数位
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
结果:
3.14
3.140000
4
8
科学计数法表示
int main(void)
{
/*float a = 3210.456;
printf("%e\n", a);*/
float b = 3.2e3f;
printf("%f\n", b);
return 0;
}
结果:
3200.000000
进制
二进制与十进制转换
十进制转换成二进制:除2反序取余法—用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
或者使用 8421法则:将十进制数使用2的n次幂数进行组合。
8—1000
4—100
2—10
1—1
十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
二进制转换成十进制: 权值法—将一个二进制数依次从末尾开始乘以2的n次幂然后相加,n从0开始。
或者使用 8421法则:那个位为1则加上其对应的十进制数
八进制与十进制转换
十进制转换成八进制:用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
八进制转换成十进制:权值法
十六进制与十进制转换
十进制转换成十六进制:用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
十六进制转换成十进制:权值法
二进制与八进制转换
二进制转换成八进制
八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
八进制转换成二进制
二进制与十六进制的转换
二进制转换成十六进制
十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。
十六进制转换成二进制
八进制与十六进制的转换
先将八进制转换成二进制,然后再将二进制转换成十六进制
C语言如何表示相应进制数
计算机内存数值存储方式
原码
一个数的原码(原始的二进制码)有如下特点:
- 最高位做为符号位,0表示正,为1表示负
- 其它数值部分就是数值本身绝对值的二进制数
- 负数的原码是在其绝对值的基础上,最高位变为1
下面数值以1字节的大小描述:
反码
- 对于正数,反码与原码相同
- 对于负数,符号位不变,其它部分取反(1变0,0变1)
补码
在计算机系统中,数值一律用补码来存储。 主要原因是:
- 统一了零的编码
- 将符号位和其它位统一处理
- 将减法运算转变为加法运算
- 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
补码特点:
- 对于正数,原码、反码、补码相同
- 对于负数,其补码为它的反码加1
- 补码符号位不动,其他位求反,最后整个数加1,得到原码
有符号数和无符号数
有符号数:有符号数是最高位为符号位,0代表正数,1代表负数。
无符号数:无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
有符号数和无符号数取值范围
数据溢出
- 当超过一个数据类型能够存放最大的范围时,数值会溢出。
- 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
- 有符号位数据溢出,比如:127+1会变成 -128,-128+1会变成 -127
类型限定符
字符串格式化输出与输入
- 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
- 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量与字符常量的不同:
示例
#include<stdio.h>
int main(void)
{
//char a = 'a';
char *b = "hello world";
printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
return 0;
}
结果:
hello world
比较
#include<stdio.h>
int main(void)
{
//char a = 'a';
char *b = "hello\0 world";
printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
return 0;
}
结果:
hello
#include<stdio.h>
int main(void)
{
//char a = 'a';
char b[11] = "hello world";//因为\0的存在b一共有12位
printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
return 0;
}
结果:因为\0的存在b一共有12位,所以在有11位时就找不到\0,所以出现乱码。
hello world烫烫虀涷80
printf函数和putchar函数
printf函数
printf是输出一个字符串。
- printf格式字符:
- printf附加格式:
示例:
#include<stdio.h>int main(void)
{
float b = 3.14;
printf("===%7.2f===", b);//7表示总体的宽度
return 0;
结果:
=== 3.14===
putchar函数
putchar输出一个char。
示例:
#include<stdio.h>
int main(void)
{
char ch = 'a';
//输出字符可以是变量、字符、数字、转义字符
putchar(ch);
putchar('\n');
putchar('B');
putchar('\n');
putchar(97);
return 0;
}
结果:
a
B
a
scanf函数与getchar函数
scanf函数
scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
示例:
#define _CRT_SECURE_NO_WARNINGS//使用scanf时需要的安全声明
#include<stdio.h>
int main(void)
{
int a, b;
scanf("%d,%d", &a, &b);//%d输入中间不能加\n,因为scanf 是以\n结尾的会被吸收掉
printf("%d\t%d", a, b);//\t表示制表符,打印空格
return 0;
}
结果
12,34
12 34
getchar 函数
getchar是从标准输入设备读取一个char。
示例:
int main(void)
{
char ch;
ch = getchar();//接收键盘获取字符
putchar(ch);
getchar();//用于暂时停留界面
return 0;
}
结果
h
h