【例3.1】符号常量的使用。
#define PRICE 30
main()
{
int num,total;
num=10;
total=num* PRICE;
printf(“total=%d”,total);
}
n 用标识符代表一个常量,称为符号常量。
n 符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
n 使用符号常量的好处是:
Ø 含义清楚;
Ø 能做到“一改全改”。
下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。
类型说明符 | 数的范围 | 字节数 |
int | -32768~32767 即-215~(215-1) | 2 |
unsigned int | 0~65535 即0~(216-1) | 2 |
short int | -32768~32767 即-215~(215-1) | 2 |
unsigned short int | 0~65535 即0~(216-1) | 2 |
long int | -2147483648~2147483647即-231~(231-1) | 4 |
unsigned long | 0~4294967295 即0~(232-1) | 4 |
以13为例:
int型:
00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
short int型:
00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
long int型:
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned int型:
00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned short int型:
00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned long int型:
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
【例3.2】整型变量的定义与使用
main()
{
int a,b,c,d;
unsigned u;
a=12;b=-24;u=10;
c=a+u;d=b+u;
printf(“a+u=%d,b+u=%d\n”,c,d);
}
【例3.3】整型数据的溢出。
main()
{
int a,b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
}
32767:
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-32768
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
【例3.4】
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);
}
【例3.6】实型数据的舍入误差。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
double a,b;//此处为 double
a=123456.789e5;
b=a+20;
printf ("%f\n",a);
printf("%f\n",b);
}
常用的转义字符及其含义
转义字符 | 转义字符的意义 | ASCII代码 |
\n | 回车换行 | 10 |
\t | 横向跳到下一制表位置 | 9 |
\b | 退格 | 8 |
\r | 回车 | 13 |
\f | 走纸换页 | 12 |
\\ | 反斜线符"\" | 92 |
\' | 单引号符 | 39 |
\” | 双引号符 | 34 |
\a | 鸣铃 | 7 |
\ddd | 1~3位八进制数所代表的字符 |
|
\xhh | 1~2位十六进制数所代表的字符 |
|
3.8.1 C运算符简介
C语言的运算符可分为以下几类:
1. 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
2. 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
3. 逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4. 位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5. 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6. 条件运算符:这是一个三目运算符,用于条件求值(?:)。
7. 逗号运算符:用于把若干表达式组合成一个表达式(,)。
8. 指针运算符:用于取内容(*)和取地址(&)二种运算。
9. 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10. 特殊运算符:有括号(),下标[],成员(→,.)等几种。
1. 自增、自减运算符
自增1,自减1运算符:自增1运算符记为“++”,其功能是使变量的值自增1。
自减1运算符记为“--”,其功能是使变量值自减1。
自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:
++i i自增1后再参与其它运算。
--i i自减1后再参与其它运算。
i++ i参与运算后,i的值再自增1。
i-- i参与运算后,i的值再自减1。
在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。
【例3.16】
//尼玛的炫耀技巧有木有,没有可读性的有木有,实际中这样写-i--会被人骂娘的有木有。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i=8;
printf("%d\n",++i); //9 8+1=9
printf("%d\n",--i); //8 9-1=8
printf("%d\n",i++); //8 输出8后,i+1 此时内存中i=9
printf("%d\n",i--); //9 输出内存中的 9,i再-1,此时内存中i=8
printf("%d\n",-i++); //-8 先执行-,输出-i=-8,再++,此时i=囧
printf("%d\n",-i--); //-9 尼玛 囧RZ
}
/*
i的初值为8,第2行i加1后输出故为9;
第3行减1后输出故为8;
第4行输出i为8之后再加1(为9);
第5行输出i为9之后再减1(为8) ;
第6行输出-8之后再加1(为9)
第7行输出-9之后再减1(为8)。*/
【例3.18】
char c1='k',c2;
...
...
printf("%d,%f,%d,%c",a,x,a,c2);
例子中这种算法不具有可读性,现实中绝对不可使用,了解即可,无需深究,所以本文不予采纳为答案。
1. 复合的赋值运算符
在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。
构成复合赋值表达式的一般形式为:
变量 双目运算符=表达式
它等效于
变量=变量 运算符 表达式
例如:
a+=5 等价于a=a+5
x*=y+7 等价于x=x*(y+7)
r%=p 等价于r=r%p
+= 加法赋值 -= 减法赋值 *= 乘法赋值 /= 除法赋值 %= 模运算赋值 <<= 左移赋值 >>= 右移赋值 &= 位逻辑与赋值 |= 位逻辑或赋值 ^= 位逻辑异或赋值
复合赋值符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。
【例3.19】改
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a=2,b=4,c=6,x,y,z;
y=(x=a+b),z=(b+c);
printf("y=%d,x=%d,z=%d",y,x,z);
}
3.1 小结
3.1.1 C的数据类型
基本类型,构造类型,指针类型,空类型
3.1.2 基本类型的分类及特点
| 类型说明符 | 字节 | 数值范围 |
字符型 | char | 1 | C字符集 |
基本整型 | int | 2 | -32768~32767 |
短整型 | short int | 2 | -32768~32767 |
长整型 | long int | 4 | -214783648~214783647 |
无符号型 | unsigned | 2 | 0~65535 |
无符号长整型 | unsigned long | 4 | 0~4294967295 |
单精度实型 | float | 4 | 3/4E-38~3/4E+38 |
双精度实型 | double | 8 | 1/7E-308~1/7E+308 |
3.1.3 常量后缀
L或l 长整型
U或u 无符号数
F或f 浮点数
3.1.4 常量类型
整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。
3.1.5 数据类型转换
·自动转换:在不同类型数据的混合运算中,由系统自动实现转换,由少字节类型向多字节类型转换。不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型。
·强制转换:由强制转换运算符完成转换。
3.1.6 运算符优先级和结合性
一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
3.1.7 表达式
表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。