2.1 引例
【例2.2】 设球半径为r、体积为v、表面积为f,输入半径r分别计算球体积和球表面积。
#include<stdio.h>
#define PI 3.14159
void main()
{
int r;
float v, f;
r = 2;
v = 4.0 * PI * r * r * r / 3.0;
f = 4.0 * PI * r * r;
printf("体积为:%f,表面积为:%f\n", v, f);
}
2.2 C语言的数据类型
···整型
···基本类型 ···字符型
···实型
···数组类型
数据类型···构造类型···结构体类型
···共用体类型
···枚举类型
···指针类型
···空类型
2.3 C语言的常量
2.3.1 直接常量
1.整型常量
十进制表示 : 0~9, 正、负号和零;
八进制表示:以0为前缀后接0~7,无符号;
十六进制表示:以0x或0X为前缀,后接0~9和字母A~F(字母大小写均可),无符号,后加u或U认为是unsingned型,l或L认为是long int型;
2.实型常量
(1)小数形式:最前后零可以不写,但小数点一定要写; - .123和12.345 均正确
(2)指数形式:由尾数部分、字母E或e和指数部分组成:±尾数E指数 如1.23E-2表示1.23×10 ^ -2, 3.14E+3表示3.14×10 ^ 3;
C语言中实型常量默认为double 型,如果后加字母f或F则是float 型;如:1.65f,654.87F;
3.字符型常量
''定义字符,""定义字符串;
字符常量只能用单引号括起来,字符常量只能是单个字符不能是字符串;可以是ASCII码中任意字符,但不同字符之间存在着次序差异(这按ASCII码来,小写字母>大写字母>数字字符);
每个字符在内存中占一个字节用于储存ASCII码;C语言中字符常量可以像整数一样参加运算'4'和4是不同的'4'的ASCII码是52
转义字符:\0 空字符(表示结束,\0之后内容都不显示);\b退格;\n回车;\n\分行连续(顶格写);\ddd(1~3位八进制所代表的字符);\xhh(1~2位十六进制所代表的字符);
转义字符:
转义字符 | 转义功能 | ASCII码值 |
\0 | 空字符 | 0 |
\a | 响铃 | 7 |
\b | 退格(Backspace) | 8 |
\t | 水平制表符(即横向跳格) | 9 |
\n | 回车换行(Enter) | 10 |
\v | 竖向跳格 | 11 |
\f | 换页 | 12 |
\r | 回车 | 13 |
\" | 双引号(") | 34 |
\' | 单引号(') | 39 |
\? | 问号(?) | 63 |
\\ | 反斜线字符(\) | 92 |
\ddd | 1~3位八进制所代表的字符 | |
\xhh | 1~2位十六进制所表达的字符 |
【例2.3】转义字符使用示例。
#include<stdio.h>
int main()
{
char b, c, d, e;
b = '\43';
c = '\103';
d = '\x2a';
e = '\x41';
printf("b=%c,c=%c,d=%c,e=%c\n", b, c, d, e);
printf("\"good\40morning!\b\"!\n");
printf("\123456");
return 0;
}
4.字符串常量
"6"相当于6\0 占两个字节
2.3.2 符号常量
#define 标识符 常量值(定义)如:#define xp 3.145
【例2.5】利用符号常量计算价格
#include<stdio.h>
#define PRICE 20
int main()
{
int num, total;
num = 10;
total = num * PRICE;
printf("总价格为:%d\n,total");
return 0;
}
2.4 C语言的变量
2.4.1 变量的定义与使用
1定义变量
int r; /*定义r为整型*/
float v,f; /*定义v、f位单精度浮点型*/
double x,y; /*定义x、y为双精度浮点型*/
char ch; /*定义ch为字符型*/
2.变量的初始化
int x=2; /*定义一个整型变量x并赋初值2*/
int s=1,t=1; /*定义两个整型变量s和t,并分别赋初值1*/
float f=3.68; /*定义一个单精度型变量f并赋初值3.68*/
char ch='x'; /*定义一个字符型变量ch并赋初值字符x*/
“int x=y=3;”是不规范的,应该使=左边的数据(类型)和右边的变量(类型)一致
3.变量的使用
【2.6】变量使用示例
#include<stdio.h>
int main()
{
int a, b, c;
char ch = 'A';
a = 10;
b = a + ch;
scanf_s("%d", &c);
printf("%d,&d,%d,%c\n", a, b, c, ch);
return 0;
}
2.4.2 整型变量
关键字 | 类型 | 占用字节 | 取值范围 |
short int | 短整型 | 2 | -32768~32767(-2^15~2^15 -1) |
int | 整型 | 4 | -2147483648~2147483647(-2^31 ~2^31 -1) |
long int | 长整型 | 4 | -2147483648~2147483647(-2^31 ~2^31 -1) |
unsigned short | 无符号短整型 | 2 | 0~65535(0~2^16 -1) |
unsigned int | 无符号整型 | 4 | 0~4294967295(0~2^32 -1) |
unsigned long | 无符号 | 4 | 0~429467295(0~2^32 -1) |
超过范围的话会溢出(也就是会产生错误的结果)
【例2.7】不同类型整型变量的定义与使用示例
#include<stdio.h>
int main()
{
int a, b, c, d;
unsigned long e;
a = 5; b = 6; e = 10;
c = a + e;
d = b + e;
printf("c=%d,d=%d\n", c, d);
return 0;
}
【例2.8】短整型变量的溢出
#include<stdio.h>
int main()
{
short int a, b;
a = 32767;
b = a + 1;
printf("a=%d,b=%d\n", a, b);
return 0;
}
2.4.3 实型变量
关键字 | 类型 | 占用字节数 | 取值范围 |
float | 单精度型 | 4 | 3.4E-38~3.4E+38 |
double | 双精度型 | 8 | 3.7E-308~1.7E+308 |
单精度型数据能保留7位有效数字,双精度型数据能保留16位有效数字;
*二者小数点后只保留六位数,超过后会四舍五入*
【例2.9】 实型变量的使用示例
#include<stdio.h>
int main()
{
float a = 1234.56789;
double b = 1234.567895678;
printf("a=%f,b=%f\n", a, b);
return 0;
}
2.4.4 字符型变量
【2.10】 字符变量的使用示例
#include<stdio.h>
int main()
{
char c1, c2;
c1 = 'A';
c2 = 65;
printf("%c,%c\n", c1, c2);
printf("%d,%d\n", c1, c2);
return 0;
}
【例2.11】 把大写字母转换为小写字母。
#include<stdio.h>
int main()
{
char c1, c2;
c1 = 'A';
c2 = 'B';
c1 = c1 + 32;
c2 = c2 + 32;
printf("%c,%c\n", c1, c2);
printf("%d,%d\n", c1, c2);
return 0;
}
2.5 运算符和表达式
2.5.1 赋值运算符和赋值表达式
1.简单赋值运算符
“=”表示赋值,“int a=b=c;”是错误的,应该写成“int a=3,b=3,c=3;”最左边只能是一个变量
2.复合赋值运算符
运算符 | 应用举例 | 等价形式 |
+= | a+=x | a=a+(x) |
-= | a-=x | a=a-(x) |
*= | a*=x | a=a*(x) |
/= | a/=x | a=a/(x) |
%= | a%=x | a=a%(x) |
3.赋值表达式
变量=表达式
赋值表达式末尾没有分号;赋值语句末尾必须有分号;if语句中不可以出现赋值语句;
2.5.2 算数运算符和算术表达式
1.基本的算术运算符
运算符 | + | - | * | / | % |
名称 | 加 | 减 | 乘 | 除 | 求余 |
+、-、*、/、%都是双目运算符,“-”当负号用时是单目运算符;
在计算a/b时,如果a,b是整型那么其商也是整型;小数部分会被舍去,3/4结果是零,4/3结果是1;
如果a,b有一个是实型那么a,b都会转换为double类型再相除其结果也是double类型;3.0/2结果为1.5
求余运算符的两个运算数都应为整型,且求余结果与第一个操作数符号相同;-4%3的值为-1;4%-3的值为1
2.自增、自减运算符
++自增运算符:前缀方式“int a=++x”“先加后用”“b=++a”等价于“a=a+1,b=a”
后缀方式“int a=x++”“先用后加”“b=a++”等价于“b=a,a=a+1”
--自减运算符同理且二者都是单目运算符
自增和自减运算符的操作对象只能是一个简单变量,不能是常量或表达式
3.算术运算符的优先级和结合性
单目运算符是右结合的,双目运算符是左结合的;单目运算符优先级高于双目运算符;
双目运算符中“*、/、%”优先级高于“+、-”
“++、- -、-”>“*、/、%”>“+、-”;“()”的优先级最高
4.算术表达式
算术表达式注意事项
1.表达式中的乘号不能省略,表达式中所有字符均应写在同一行上;
2.可以使用多层圆括号但要注意括号的配对(不能用[]和{});
3.不能拿0当除数;
【例2.13】 输入一个3位正整数(123),输出其反序数
#include<stdio.h>
int main()
{
int number, a, b, c;
number = 123;
printf("输入的3位数为:%d\n", number);
a = number / 100;
b = (number - a * 100) / 10;
c = number % 10;
printf("反序数是:%d%d%d\n", c, b, a);
return 0;
}
2.5.3 逗号运算符和逗号表达式
逗号运算符是双目运算符,优先级最低,左结合
【例2.14】逗号表达式应用示例
#include<stdio.h>
int main()
{
int i, j = 7;
float k = 5;
i = (j = j + 2, j / k);
printf("i=%d\n", i);
return 0;
}
2.5.4 求字节数运算符
格式:sizeof(表达式)或sizeof 表达式;sizeof(数据类型名)
sizeof("china")=6 实际上是“china\0”
char类型占1字节
short int类型占2字节
int类型占4字节
float类型占4字节
double类型占8字节
#include<stdio.h>
int main()
{
printf("char类型占%d字节\n", sizeof(char));
printf("short int 类型占%d字节\n", sizeof(short int));
printf("int 类型占%d字节\n", sizeof(int));
printf("float 类型占%d字节\n", sizeof(float));
printf("double 类型占%d字节\n", sizeof(double));
return 0;
}
【例2.16】求字节运算符示例
#include<stdio.h>
int main()
{
int a, b;
a = sizeof(3 + 5.0);
b = sizeof 3 + 5.0;
printf("%d,%d,%d\\", a, b, sizeof("china"));
return 0;
}
2.6 数据类型转换
2.6.1 自动类型转换
为了不丢失数据
char,short→int→usigned→long→double←float
2.6.2 强制类型转化
把表达式的运算结果强制转换成类型说明符指定类型。
【例2.18】 强制类型转换示例。
#include<stdio.h>
int main()
{
int a = 3, b = 4;
float c;
c = (float)(a + b) / 2;
printf("c=%f\n", c);
return 0;
}