C语言的特点
1.简单紧凑
2.c语言可以直接访问物理地址,能够进行位操作,实现汇编语言大部分功能
3.可移植性好
程序设计思想
面相过程:以事件为中心的编程思想
面向对象:以实物为中心的编程思想
数据类型

1.基本数据类型最主要的特点是,其值不可以在分解为其他类型。也就是说,基本数据类型是自我说明的。
2.构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或者 “元素“。每个成员都是一个基本数据类型或者又是一个构造类型。
基本数据类型
1.对于基本数据类型,按其取值是否可改变又分为常量和变量两种。
2.在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。
3.整型量包括整型常量、整型变量
逻辑类型
只有两个量true和false,表示逻辑真值,逻辑假值
字符类型
char
sizeof 打印数据类型所占字节数长度

1111 1111为-127,1000 0000为-128
计算机在内存中存储方式是补码
一个字节长度byte=8个二进制位bit
原码:符号位加上真值的绝对值,用最高位表示符号位,其余位表示值
反码:正式的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余位按位取反
补码:正数的补码是其本身;负数的补码是,在其原码的基础上,符号位不变,其余位按位取反后+1
使用char数据类型的变量需要特别注意,防止数据超出值域
![]()
一:-1 作为 int,补码全 1,赋给 unsigned char,截断后 0xFF。
二:存储确实是补码形式(二进制全 1)。
三:输出 % d 时,unsigned char 提升为 unsigned int,值 255,所以输出 255,不是 - 1。

例1
#include <stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n",c);
return 0;
}
//按照正常的加减运算,结算结果应该是130,但实际上是-126
//原因是发生了整型的提升与截断
//数字3的补码为:0000 0000 0000 0000 0000 0000 0000 0011
//将数字3交给a时,因为char类型只占1个字节即8bit,所以需要进行截断,只保留最后的8个bit
//所以此时a中储存的bit位为:0000 0011//数字127的补码为:0000 0000 0000 0000 0000 0000 0111 1111
//同理也因为char类型发生截断,截断后b中存储的bit位为:0111 1111
//在执行a+b时,要先对8bit为的a和b进行整型提升,因为a和b都是char类型,所以是有符号位
//提升时,补最高位的数字。因为a和b最高位的数字都为0,所以在最高位补0即可,补够32位
//提升后两者的补码为
//3:0000 0000 0000 0000 0000 0000 0000 0011
//127:0000 0000 0000 0000 0000 0000 0111 1111
//3+127:0000 0000 0000 0000 0000 0000 1000 0010
//又因为c也是char类型的,只能存放8bit。也需要进行截断
//截断后c中存储的bit位为:1000 0010//在进行打印输出的时候是%d即整型int类型打印输出
//int 类型占4个字节,32位bit
//所以要对c进行整型提升
//因为c的最高位是1,所以在最高位前面补1,补齐32位即可
//提升后的c为:1111 1111 1111 1111 1111 1111 1000 0010
//c转化为原码之后为:1000 0000 0000 0000 0000 0000 0111 1110
//c原码对应的值为-126
例2
#include <stdio.h>
int main()
{
char n = -129;
printf("%d\n",n);
}
//同样的道理
//整数-129的补码为 1111 1111 1111 1111 1111 1111 0111 1111
//-129补码的求法:
//129的原码为:0000 0000 0000 0000 0000 0000 1000 0001
//-129的原码为:1000 0000 0000 0000 0000 0000 1000 0001
//-129的反码为:1111 1111 1111 1111 1111 1111 0111 1110
//-129的补码为:1111 1111 1111 1111 1111 1111 0111 1111
//因为char类型只能存放8bit,所以要发生截断
//被截断后为:0111 1111
//以%d的形式打印输出的时候,要进行整型提升
//截断后最高为0,所以在最高位前补0,补够32位
//提升后的补码为:0000 0000 0000 0000 0000 0000 0111 1111
//因为提升后的补码最高位是0,所以为正数
//正数的原码、反码、补码相同
//提升后的原码为:0000 0000 0000 0000 0000 0000 0111 1111
//打印输出的值为127
整数类型
short
短整型,类型说明符为short或short int

int

long
长整型,类型说明符为long int 或long,占四个字节空间
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c,d;
unsigned u;
a = 12;
b = -24;
u = 10;
c = a + b;
d = b + u;
printf("c = %d,d = %d \n",c,d);
return 0;
}

#include <stdio.h>
#include <stdlib.h>
int main()
{
short int a,b;
a = 32767;
b = a + 1;
printf("b = %d \n",b);
return 0;
}

32767 : 0111 1111 1111 1111
-32768: 1000 0000 0000 0000
#include <stdio.h>
#include <stdlib.h>
int main()
{
long x,y;
int a,b,c,d;
x = 5;
y = 6;
a = 7;
b = 8;
c = x + a;
d = y + b;
printf("c = x + a = %d,d = y + b = %d \n",c,d);
return 0;
}

从程序中可以看出: x,y 是长整型变量,a,b是基本整型变量。他们之间允许进行运算,运算结果为长整型。但c,d被定义为基本整型,因此最后结果为基本整型。
本例说明,不同类型的量可以参与运算并相互赋值,其中的类型转换是由编译系统自动完成的。
浮点类型
float和double
bool类型
1.<stdbool.h>
2.占一个字节空间

常量
程序运行期间其数值不发生变化的数据
整型常量
整型常量通常被称为整数,整数可以是十进制,八进制,十六进制
在程序中是根据前缀来区分各种进制数的。
1.十进制整常数: 十进制整常数没有前缀,其数码为 0 ~9.
十进制的数值3356
2.八进制整常数: 八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0-7.八进制数通常是无符号数。
八进制数 06434
3.十六进制整常数:十六进制整常数的前缀为0x或者0X,其数码取值为0~9,A~F或a~f。
十六进制数 0xd1c
print输出时,%o八进制、%x十六进制、%f 浮点型、%e指数型
浮点常量
1.实型也称为浮点型。实型常量也称为实数或者浮点数。在一般含有小数部分
2.C语言中,实数只有十进制的实数,它有两种形式:十进制小数形式,指数形式。分为单精度和双精度
3.十进制数形式: 由数码0~9 和小数点组成。
例如:0.0 , 25.0 , 5.789 , 0.13 , 5.0 , 300. ,-264.89
均为合法的实数,必须要有小数点
标准C允许浮点数使用后缀。后缀为”f” 或 “F”,即表示该数为浮点数。如356f和356.是等价的。
指数常量
1.指数形式的实数一般是由尾数部分、字母e或E和指数部分组成。
由十进制数,阶码标志( “e” 或 “E”)以及阶码(只能为整数,可以带符号)组成
一般形式为:a E n (a 为十进制数, n为十进制整数)
2.当一个实数的符号为正号时,可以省略不写
1.176e+10 表示 1.176 x 10^10
-3.5789e-8 表示 -3.5789x10^-8
0.5E7表示0.5*10^7
+10表示×10的10次方,
-8表示×10的负8次方
以下不是合法的实数:
345 (没有小数点)
E7 (阶码标志前无数字)
-5 (无阶码标志)
53.-E3(符号位置不对)
2.7E (无阶码)
实型数据扩展
实型数据一般占4个字节(32位)内存空间。按指数形式存储。
实数3.14159在内存中的存放形式如下
符号
小数部分
指数部分
+
.314159
1
小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高
指数部分占的位数愈多,则能表示的数值范围愈大
float型,32位:1位符号位,8位指数位,23位尾数位
因为单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位,不包含小数点。
C语言中,%f表示的保留7位有效数字是指整数部分和小数部分一共7位
注意:标准形式:小数点前保留一位数,以float输出时,保留6位小数,四舍五入
#include <stdio.h>
#include <stdlib.h>
int main()
{
float q = 1234567.012345;
printf("%f\n",q);
return 0;
}

实型变量分为: 单精度(float 型),双精度(double 型),和 长双精度(long double 型) 三类。
单精度型占四个字节(32位)内存空间,其数值范围为 3.4E -38 ~ 3.4E +38只能提供七位有效数字。
双精度型占八个字节(64位)内存空间,其数值范围为 1.7E-3.8 ~1.7E +308,可提供16位有效数据。
实型数据的舍入误差:由于实型数据变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。
#include <stdio.h>
#include <stdlib.h>
int main()
{
float a,b;
a = 123456.789e5;
b = a + 20;
printf("%f \n",a);
printf("%f \n",b);
return 0;
}

注:七位有效数据以后是乱码
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%f\n",1.0/3);
printf("%f\n",1.0/3*3);
printf("%d\n",1/3*3);
printf("%d\n",3/2);
return 0;
}

字符常量
1.字符常量是指一个单一字符,其表示形式是由两个单引号包括的一个字符
2.字符常量具有数值,值等于字符的ACSII码值
在C语言中,字符常量有以下特点:
1.字符常量只能用单引号括起来,不能用双引号或其他括号
2.字符常量只能是单个字符,不能是字符串
3.字符可以是字符集中任意字符,但数字被定义为字符型之后就不能参与数值运算。
如 ‘5’和 5 是不同的。‘5’ 是字符常量,不能参与数值运算。
例如: char a,b,c,d;
a = 'F'; //把70赋值给a
b = 'A'+2; //b存放的是'C'字符
c = ' '+'B'; //c存放的是'b'字符
d = 'b'-32; //d存放的是'B'字符
他们分别相当于下列运算:
a = 70;
b = 65+2;
c = 32+66;
d = 97-32;
A 65,a 97,0 48,空格 32
3.转义字符
转义字符是一种特殊的字符常量。转移字符以反斜杠 “\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称为 “转义”字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码。

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("ab c\tde\rfo\'\nrr\n");//\r回车,在该行起始重新输入
printf("hijk\t\Bm\n\'");
return 0;
}

注:\r回车符,在本行的最开始重新输入数据并覆盖,即回车不换行 ,\B会报警告
4.字符数据在内存中的存储形式及使用方法
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。 如x的十进制ASCII码是 120, y的ASCII码是121。
对字符变量a,b,赋予’x’和’y’值:
a = ‘x’ ; b = 7 ;实际上是在a,b两个单元内存放 120 和55 的二进制代码。
向字符变量赋常量
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a,b;
a = 120;
b = 121;
printf("%c %c\n",a,b);
printf("%d %d\n",a,b);
return 0;
}

本程序中定义a,b为字符型,但在赋值语句中赋以整型值。从结构看,a,b值的输出形式取决于printf函数格式中的格式符,当格式符为 “c”时,对应输出的变量值为字符,当格式符为”d”时,对应输出的变量值为整数。
小写字母转换为大写字母
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a,b;
a = 'a';
b = 'b';
a = a - 32;
b = b - 32;
printf("%c %c\n%d %d\n",a,b,a,b);
return 0;
}

字符串常量
1.是指双引号括起来的一串字符串来表示的数据(字符串以'\0'结尾)
2.字符串常量和字符常量可以转化。“9” = '9' + '\0'
字符串常量和字符常量是不同的量。他们之间主要有以下区别:
1.字符常量由单引号括起来,字符串常量由双引号括起来。
2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。
例如: 可以char a = ‘a’ 但是不能 char a = “a” ;
3.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数+1. 增加的一个字节中存放字符 “\0”(ASCII 码为0),这是字符串结束的标志。
字符常量‘a’和字符串常量”a”虽然都只有一个字符,但在内存中的情况是不同的,
‘a’ 在内存中占一个字节,可表示为:
“a”在内存中占两个字节,可表示为:
标识常量
1.是指用标识符替代常量使用的一种常量,其名称通常是一个标识符,标识符常量也叫符号常量,一般用大写英文字母的标识符,在使用之前必须预先定义
2.说明形式:宏
3.只是简单的替代,为了安全给成员加括号
#include <stdio.h>
#include <stdlib.h>
#define PRICE 30
int main()
{
int sum,total;
sum = 10;
total = PRICE * sum;
printf("total = %d\n",total);
return 0;
}
注意:
中间要用,隔开

被折叠的 条评论
为什么被折叠?



