本文用于个人交流学习使用,参考第三版C语言程序设计(刘国成、刘柏生、倪丹著)
知识背景:常量的数据在源程序中直接给出,除非改变源代码,否则常量的值不可能改变。变量代表着一个数据值的名称,变量名可以和很多数据建立关联,可以修改变量的值。常量和变量通过运算符和函数合并就构成了表达式。
一.常量
1.背景:
- 在数学公式中,经常用一些符号表示值已知的常量。如r代表直径,周长公式中c=2Πr。其中,r可随着数据的改变而改变,但2和Π是不变的常量。
- 运行过程中,值不变的量叫做常量。
- 常量是有类型的,根据形式和值来决定
2.常量类型
(1)整型常量
可以用十进制、八进制、十六进制来表示
- 十进制整型常量:由正负号和0-9范围内的数字组成,并且第一个数字不能是0
- 八进制整型常量:由正负号和0-7范围内的数字组成,并且第一个数字必须是0,表示这是一个八进制数字
- 十六进制整型常量:由正负号和数字0-9、a-f或A-F组成,并且要有前缀0x,例如-0xabcd。能保存最大整数值取决于具体的计算机,通过给常量赋上U\L\LU(大小写均可)的修饰符,可以保存更大的整数。例如23和23L数值上相等但类型不同,后者为长整型。例如,56789U表示无符号整数
(2)浮点型常量
- 十进制小数形式表示实型常量:由正负号和小数点组成,一定要有小数点,且小数点的前后至少一边要有数字,如.123、+3.14159265
- 指数形式表示实型常量:由正负号、数字、小数点和e(E)组成。在符号e前面必须要有数据(整数或实数),e的后面跟一个指数,指数必须是整数。指数形式一般适合于表示较大或较小的实数。实数的指数形式也称为科学计数法。例如1.2345678e3=1.2345678×10的三次方。浮点常量在没有任何后缀的时候通常表示为double类型(双精度数),但是后缀f或F用于强制转换为单精度数f。例如3.1415926535f为float类型实型常量。后缀为L/l表示为long double
(3)单字符常量
- 字符常量是用一对单括号括起来的一个字符,如'A'、'a'、‘5’
注意:字符常量5和数字5是不一样的。字符常量是对应ASCII值
例如
printf(“%d”,‘a’);
此时显示出来数字97。由于每个字符常量都表示了一个整数值,因此可以对字符常量进行算术运算。
- 转义字符
转义字符来表示一些控制字符。以反斜杠开头
\n | 换行(输出位置移到下一行开头) |
\t | 横向跳格(输出位置移到下一个输出区) |
\b | 退格(移出位置移到前一列) |
\r | 回车(输出位置移到本行首) |
\\ | 反斜杠字符\ |
\' | 单引号‘ |
\'' | 双引号'' |
\ddd | ASC为八进制数ddd的字符,如“\141”为字符'a' |
\xhh | ASC为十六进制hh的字符,如“\x61”为字符'a' |
printf("12345\r6789\n");
输出结果为6789
printf("123\b456\n");
输出结果为12456
\t实现横向跳格功能,将输出位置移到下一个Tab位置,即按下Tab时,系统会根据当前光标所在的制表位置自动跳到下一制表位置的开始处,多用于对齐格式控制
例如:
printf("Name\t\tAge\t\tEmail\n");
printf("John\t\t18\t\tjohn@qq.com\n");
printf("lili\t\t47\t\tlili@qq.com\n");
输出结果为
Name Age E-MAIL
john 18 john@qq.com
例如
printf("C\\windows\n");
可以输出路径
注意:
转义字符形式上由多个字符或数字组成,但它表示的是一个字符常量
(4)字符串常量
字符串常量是由一对双引号括起来的字符串列。例如,“Hello!”。字符串中字符的个数称为字符串的长度,字符串一般都有一个结束标志\0。字符串结束标志不计入字符串的长度,但是占用内存空间。
'X'and "X" is different.单个字符的字符串常量没有对应的整数值,而单个字符常量则有对应的整数值。
(5)符号常量
符号常量实际上是编译预处理命令定义的标识符,这个标识符代表一个常量,称为符号常量。系统在编译时,会将程序中的所有符号名对应成对应的常量。
定义格式如下
#define<符号常量名><常量>
#definePI 3.1415
定义之后不需要加分号,通常使用大写字母定义
For example
#include<stdio.h>
#definePI 3.1415
main()
{
float radius,circumf,area;
scanf("%f",&radius);
cricumf=2*PI*radius;
area=PI*radius*radius;
printf("circumf=%d,area=%d",circumf,area);
}
输出结果为
1
crircumf=6.28
area=3.14
在系统编译前的预处理过程中,会自动将所有的PI替换。
#define是一个编译预处理指令
二.变量
变量代表一个有特殊名称和类型的存储单元。变量的值在程序运行过程中是可以改变的。
名称、类型、值构成变量的三要素。
将变量想象成一个外面贴有标签的盒子,盒子外面的标签就是变量的名称,用户拥有多个变量时候,可以使用标签名来区分。
1.变量名
使用变量时候需要用到变量名,变量名属于标识符的一种。
(1)标识符和关键字
在编写程序时侯,需要对变量、函数、宏和其他实体进行命名,这些名称称为标识符。由系统所指定的标识符称为保留字或关键字。关键字由特定的含义,用户不能再将它作为一般标识符使用
(2)自定义标识符的命名规则
a.必须以字母或下划线开头,C语言区分标识符的大小写
b.只能由字母、数字、下划线组成,不能有空格、小数点等特殊字符
c.不能和系统关键字重名
2.变量类型
(1)整型
C语言中的整型数据分为基本整型(int)、长整型(long int简写为long)、短整型(short int,简写为short)。整型数据中又分为有符号整数和无符号整数(unsigned)
(2)浮点型
需要变量储存能带小数点的数或者存储极大或极小数,这种类型可以用浮点型进行存储。
- float单精度浮点数
- double双精度浮点数
- long double长精度浮点数
(3)字符型
例:将小写字母转换成大写字母
#include<stdio.h>
main()
{
char lowercase='a';
char uppercase=lowercase-32;
printf("%c",uppercase);
}
运行结果为
A
注意:
%c对应字符型数据的输出,大写的ASCII码值比对应的小写字母少32
3.sizeof运算符
sizeof运算符可以确定某种类型的数据所占据的字节数。sizeof的基本用法是sizeof(类型名)或sizeof(常量、变量或表达式),sizzeof的返回值的类型为unsigned int类型。
#include<stdio.h>
main()
{
printf("int:%dbytes\n",sizeof(int));
}
运行结果为
int:4bytes
4.变量的定义及操作
先声明、定义,后引用、使用
(1)变量的定义
数据类型标识符 变量名1,变量名2...
int age,reach;
unsigned int height,weight;
(2)变量的初始化和赋值
变量在定义后如果没有对其进行复制,其相应的存储空间往往包含着不可预知的值,不能直接使用。
- 先定义后赋值
int n;
n=10;
- 变量初始化
int a=1,b=1,c=1;
不能写成a=b=c=1
三.运算符和表达式
1.简要介绍
- 一元运算符,操作数 运算符或运算符 操作数之间的形式
i++,--j
- 二元运算符 操作数1 运算符 操作数2
x+y
- 三元运算符
? :
表达式1?表达式2:表达式3
2.算术运算符和算术表达式
3.关系运算符和关系表达式
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
由关系运算符将两个表达式连接而形成的运算式子称为关系表达式
一个关系表达式的结果类型是bool(布尔)类型
当关系表达式成立的时候,其值为真(1),不成立的时候,其值为假(0)
注意:=代表赋值含义,==代表着相等含义
4.逻辑运算符和逻辑表达式
! | 逻辑非 | !(i<9) |
&& | 逻辑与 | (i>0)&&(i<9) |
|| | 逻辑或 | (i==0)||(j>0) |
优先级:! >&& >||
5.赋值运算符和赋值表达式
(1)简单赋值
a=5
- 先计算赋值运算符右侧表达式的值
- 将赋值运算符右侧表达式的值赋值给左侧的变量
- 整个赋值表达式的值就是被赋值变量的值
赋值的含义:将赋值运算符右边表达式的值存放到左边变量名标识的存储单元中。
赋值表达式的功能:赋值+计算
赋值运算符左边必须是变量,右边可以是变量、常量、调用函数
等于号没有相等的含义
(2)复合赋值
利用变量原有值计算出新值并重新赋值给这个变量
x*=2 | x=x*2 |
x/=2 | x=x/2 |
x+=2 | x=x+2 |
x-=2 | x=x-2 |
x%=2 | x=x%2 |
结合性为从右到左
6.自增、自减运算符
(1)优先级高于所有双目运算符,功能是使变量的值加一或减一,结合性为右结合性。
x=++i相等于x=i+1,i=i+1
x=i++相等于x=i,i=i+1
简言之,前者属于先计算再赋值,后者属于先赋值再计算。
例如,x=5,y=++x。那么过程为x=x+1,即为x=6,y=x,那么y=6。先计算再使用
例如,x=5,y=x++。那么过程y=x=5,x=x+1,x=6。先使用在计算
这一个运算式子中运算加赋值两个功能
7.条件运算符
三目运算符 表达式1?表达式2:表达式3
如果表达式1成立,则输出表达式2的值;如果表达式1不成立,则输出表达式3的值
8.逗号运算符和逗号表达式
基本形式为:表达式1,表达式2....表达式n
求解过程为从左到右进行求解,最后的值为表达式n的值
四.运算符的优先级和结合性
1.
a+=b*=c-=5,同时a初值为3,b初值为5,c初值为8
等价于
(从右往左结合)
c=c-5,b=b*c,a=a+b
最终a=18,b=15,c=3