一、符号常量:用标识符代表一个常量。在使用前必须定义。
定义格式:
#define 标识符 常量
#define也是一条预处理命令(以#号开头 所谓预处理是指程序在还没有编译之前进行的处理)称为宏定义命令
注意:习惯上符号常量的标识符用大写字母 变量标识符用小写字母
例:
#define PRICE 30
注意:符号常量与变量不同,他的值在其作用域内不能改变,也不能被赋值
使用符号常量的好处是:
1)含义清楚
2)能做到一改全改
二、变量:
上图为C语言变量原理图
1、整形数据
1)整形常量
八进制整常数必须以0开头如:015 0101
十六进制整常数的前缀为0X或0x如:0x2A 0XA0
在16位的机器上基本整形的长度是16位的。因此表示的数是有范围的,十进制无符号整常数的范是0~65536(2的16次方)。有符号是-32768~32758 现在都32位64位了那就是2的32次方和2的64次方
如果超过了上述范围就必须加上后缀如长整形“L”或“l”
课外说明:一个字节BYTE=8bit 宽带 2M 是指 2Mbps 这里的b是bit 所以要除以8
2)整型变量
变量的值在内存中是以二进制存储的
数值是以补码表示的
正数的补码和原码相同
负数的补码:将该数的绝对值的二进制形式按位取反再加1
例如:-10的补码
10的原码: 00001010
取反: 11110101
再加1,得-10的补码: 11110110
第一位是符号位如果为1表示为负数
看一下编译器表示的基本变量占多少字节
#include <stdio.h>
void main()
{
printf("%d\n",sizeof(int));
}
那么关于整形变量
类型说明符 数的范围 字节数
int (这是有符号的) -65536~+65536 4
#include <stdio.h>
void main()
{
short a,b;
unsigned short c = 65536;
printf("short长度:%d\n",sizeof(short));
a = 32767;
b = a + 1;
printf("a=%d,b=%d\n",a,b);
printf("unsigned short长度:%d\n",sizeof(unsigned short));
printf("c=%d\n",c);
}
上面的例子c溢出了利用补码解释一下
对于正数,反码,补码与原码相同。
对于负数,补码是原码的符号位不变,数值部分按位取反再加1。
short型数据2字节共16位 取值范围是 -32768~32767 1000000000000000(-32768的补码)~0111111111111111 short型32767补码是0111111111111111 加1后为1000000000000000(注意最高位是符号位),1000000000000000正是-32768的补码。
unsigned short型数据是16位都用来表示数值,16位0000000000000000-1111111111111111表示的范围是0-65535
unsigned short型数据无符号65535为1111111111111111(16位),加1后为10000000000000000(17位)这时计算机判断溢出后丢弃第17位,变为0000000000000000就是0了
3)浮点型
两种形式:
十进制小数形式:5.478
指数形式:由十进制数加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成:
0.5E7 等于 0.5*107 -2.8e-7等于-2.8*10-7
标准C允许浮点数使用后缀。后缀为"f"或"F" 如:356f与365.是等价的
3.14159在内存中的存放形式:以指数形式存放
第一位 2~8位 第9位 再后
符号 小数部分 指数符号 指数
+ .314159 + 10的几次方
三、运算
1、除法运算注意
printf("%d\n",3/2);舍去小数为1
printf("%f\n",3/2); 运行错误,整形除整形不能赋值给浮点
printf("%d\n",3.0/2);这个可以都转为double
总之类型要一致
2、自增 自减
例如
#include <stdio.h>
void main()
{
int y,i=5;
int x,b=5;
y=i++;
printf("y=%d\n",y);
printf("i=%d\n",i);
x=++b;
printf("x=%d\n",x);
printf("b=%d\n",b);
}
结果:
y=5
i=6
x=6
b=6
press any key to continue
由上可以看出y=i++; 是先把i赋值给y然后i自增1所以y=5 i=6
x=++b;是b先自增1再赋值给x所以b=6 x=6;
总结:++前置:b自增1后再参与其它运算;++后置:i参与运算后,i的值再自增1
#include <stdio.h>
void main()
{
int i=8;
printf("i=%d\n",i++);
printf("i=%d\n",i);
}
结果:
i=8
i=9
这个更明白一些..这个i++是关键......
3、类型转换
例如:
#include <stdio.h>
void main()
{
int a,m,b=322;
double x,y=8.88;
char c1='k',c2;
a=y;
x=b;
m=c1;
c2=b;
printf("a=%d,x=%f,m=%d,c2=%c\n",a,x,m,c2);
}
结果
a=8,x=322.000000,m=107,c2=B
Press any key to continue
解释:字符型赋值给整型,由于字符型为一个字节,而整形为四个字节,故将字符型的ASCII码值放到整型量的低八位中,高位为0。整型赋予字符型只把低八位赋予字符量
4、复合的赋值运算符
例:
a+=5 等价于a=a+5
x*=y+7 等价于x=x*(y+7)
r%=p 等价于r=r%p
可以提高编译效率
5、逗号运算符
int a=2,b=4; 这些不是逗号运算符
y=(x=a+b),(b+c)
把最后一个b+c的值赋值给y