大家好,欢迎来到IT知识分享网。
1.C程序组成元素
#include <stdio.h> //编译预处理指令 int main() //主函数的函数头 { //函数体的开始标记 int a,b,c //定义三个整型变量 scanf("%d%d",&a,&b); //运行程序时,分别为a,b复制 c=a+b //计算a+b的值,并将结果赋值给c printf("a=%d,b=%d,c=%d\n",a,b,c); //依次输出a,b,c的值 return 0 //程序的返回值为0 } //函数的结束标记
1.1关键字
C语言中规定具有特别意义的字符串称为关键字,亦称保留字,C语言的关键字共有37个
C语言中的关键字大致分为以下几类:
1.数据类型说明符
2.语句定义符
3.存储类型关键字
4.其他关键字
1.2变量与常量
所谓变量,就是程序运行过程中可以改变值的量。而常量是指程序运行过程中,其值不变的量
1.3标识符
标识符指编程人员在编写程序时自己规定的具有特殊含义的词,用来表明设定的变量名、数组名、函数名等
符合以下命名规则:
标识符只能由字母、数字、下划线组成,并且第一字符必须是字母或者下划线,不能是数字
标识符区分英文字母大小写
标识符不能是C语言中的关键字
另外,理论上C语言并不限制标识符的长度,但实际上标识符的长度受到不同C语言编译系统和机器系统的限制。例如,某些编译程序中规定标识符前八位有效,即当两个标识符前八位相同时,会被认为是一个标识符
1.4数据类型
在C语言中,数据类型可以分为四类,它们分别是基本类型、构造类型、指针类型和空类型。其中,基本类型分为整型、实型、字符型和枚举型;构造类型分为数组类型、结构体类型和共用体类 型。
2.常量
在C语言中,常量的命名需要大写(这是一个约定俗成的规则,也可以小写)
2.1整型常量
整型常量的取值范围与计算机的操作系统和C语言编译器有关
在编写整型常量时,也可以在常量的后面加上L(l)或者U(u)进行修饰,L表示长整型,U表示无符号整型
整型常量即整常数,C语言中整形数据可以有以下三种表达形式:
十进制数,如23、-25
整形数据都是以二进制的方式存放在计算机的内存中,数值是以补码的形式进行表示的。一个正数的补码与原码相同,一个负数的补码是将该绝对值的二进制形式按位取反后加1。
对于有符号整数,在内存中存放的最左面一位表示符号位,如果该位为0,则为正;为1,则说明为负。
八进制数,C语言中八进制以数字0开头,只能用0~7组合表达,如0154对应的十进制数为4*8^0+5*8^1+1*8^2=108
十六进制数,C语言中十六进制以0x或0X开头,只能用0~9及字母A~F表示。其中A代表数字10,以此类推,F代表15.如0x15F对应的十进制数为15*16^0+5*16^1+1*16^2=351(十六进制中,字母A~F也可以小写表示)
2.2实型常量
实型数据值带有小数的数值,又称为浮点数。C语言中实型常量只能用十进制表示
1.直接十进制形式
2.指数形式,通常用来表示一些比较大或比较小的数值,格式为:实数部分+字母E或e+正负号+整数。其中字母e表示十次方,正负号表示指数部分的符号。例如,0.0013表示为1.3e-3,-1482.5表示为-1.4825e3
在编写实型常量时,可以在常量的后面加上L或者F修饰,其中L表示float单精度类型,F表示long double长双精度类型,默认情况下,为double双精度类型(大小写通用)
2.3字符型常量
字符型常量包括字符常量、字符串常量和转移字符
1.字符常量
C语言中字符常量必须用单引号括起来,且单引号中只能是单个字符。字符型数据以ASCII码形式存储,字符常量的值就是其对应的ASCII码的值。因为ASCII码值为整形,所以C语言中字符型数据与整型数据可以互用
2.字符串常量
字符串常量是一对双引号括起来的一个或多个字符。
C语言中存储字符串常量时,系统惠子字符串的末尾自动增加一个’\0’作为字符串结束的表示。例如,字符串“chain”在内存中的存储形式为
| c | h | a | i | n | \0 |
如上图可知,chain占据6个字节,而不是5个字节
字符‘A’和字符串“A”是不同的,字符只占据一个字节,而字符串占据2个字节
同样字符‘a’和‘A‘也是不同的,C语言对于大小写很敏感
#include<stdio.h> #define a "asdf\0qwer" int main () { printf(a); return 0; }
输出结果是asdf
3.转义字符
C语言中有一类特殊字符,以“\”开头,后跟一个字符。转义字符通常用来表示一些控制代码和功能定义
C语言常用转义字符
| 转义字符 | 说明 | 转义字符 | 说明 |
| \n | 回车换行 | \’ | 单引号‘ |
| \b | 退格 | \” | 双引号“ |
| \r | 回车 | \a | 鸣铃(电脑会发出”叮“的一声) |
| \t | 水平制表 | \f | 走纸换页(打印时,会换一页纸) |
| \v | 垂直制表 | \ddd | 1~3位八进制数所代表的字符 |
| \\ | 反斜线符\ | \xhh | 1~2位十六进制所代表的字符 |
2.4符号常量
符号常量,即以一个标识符来代表一个字面常量,通常利用C语言的宏定义命令#define来声明,例如:#define PI 3.
其含义就是程序中用到3.的地方都可以用标识符PI来替代
3.变量
变量是程序运行过程中其值可以改变的量。变量有三个属性,包括变量名、变量值和存储空间
变量的定义即确定变量名并同时确定变量所占据的存储空间,格式为:
[存储类型] 数据类型 变量名1[,变量名2……];
其中,存储类型表示变量在内存中的存储方式,可省略
定义变量时可以单独定义,也可以同时定义多个变量,多变量的定义必须用英文逗号隔开
double a,b,c;
在C语言中任何变量都必须”先定义,后使用“
3.1整型变量
整型变量是用来存储整数的变量。整型可分为两大类:有符号和无符号。有符号整数是指数值可以带正负号,所以需要一个符号位;无符号整数指的是数值只有正数,所以去掉符号位。默认情况下,C语言的整型变量都是有符号的,如果需要声明成无符号用关键字unsigned表示
常用的有符号整型用关键字Int表示,长度为32位(占据2个或4个字节,具体由编译器决定)。此外,长整型关键字long;短整型关键字short
定义一个有符号整型变量的方法就是在变量前使用关键字int。
1.int a; 2.int a=0; //也可以在定义的同时赋值
具体的关键字表示和各类型的取值范围如图
如果要定义其他类型的整型,只需更换关键字即可,[ ]表示可省略
需要注意的是有符号整数将存储单元中最左侧的一位作为符号位,如果改位为0,表示数值为正;该位为1,表示数值为负
用户定义的同时也可以为变量赋初值,这种形式称为变量的初始化。例如:
int a=0;
有符号短整型数据的溢出
#include <stdio.h> int main() { short a,b; a=32767; b=a+1; printf("a=%d,b=%d",a,b) return 0; }
输出结果为
因为short的取值范围是-32768~32767,所以无法表示大于32767或者小于-32767的数,所以当a的值加一后变成了32768就发生了溢出。但并不会报错,从最小数开始计算
在使用整型常量时,可以在常量的后面加上L(l)或者U(u)进行修饰。L表示该常量为长整型,U表示该常量为无符号整型
3.2实型变量
实型变量根据精度可以分为单精度、双精度和长双精度等3种类型
因为单精度类型只有六位有效数字,如果超过六位,后面的数据将无法正确处理,显示的时会在第七位四舍五入
用格式输出函数printf输出时,输出格式采用%f,默认输出六位小数,不足六位补0,多于6位四舍五入。
3.3字符型变量
字符型变量定义的关键字位Char,在内存中占一个字节
字符型数据和整型数据的互用
#include<stdio.h> int main() { char ch; int in; ch = 'a'; in = 97; printf("%d\n",ch); //97 printf("%c\n",ch); //a printf("%d\n",in); //97 printf("%c\n",in); //a return 0; }
用格式输出函数printf输出字符型数据时,输出格式为%c;采用%d时输出对应的ASCII值
如果需要定义字符串变量,需要采用字符数组的方式定义
1.char str[] = { “abcd” }; 2.char str[] = “abcd”; 3.char str[] = { ‘a’, ‘b’, ‘c’, ‘d’}; //编译器会自动在后面加上\0表示结束,如果自己加上\0那么\0后面的字符和常量一样无法输出
3.4变量的存储类别
变量的存储类别主要有自动(auto)、静态(static)、寄存器(register)、和外部(extern)
1.auto动态存储
用于定义一个局部变量为自动的,意味着每次执行到该变量时,都会对其初始化
#include <stdio.h> aaa() { auto int a=1; a=a+1; printf("%d\n",a); } int main() { printf("第一次调用"); aaa(); printf("第二次调用"); aaa(); return 0; }
运行结果:
事实上,默认的存储类型就是动态的,所以auto可以省略
2.static静态变量
语句块执行期间,static变量将会始终保持它的值,在随后的运行过程中,变量将保持上一次运行的值
另外,将函数的内部变量声明和外部变量声明意义是不同的
#include <stdio.h> aaa() { static int a=1; a=a+1; printf("%d\n",a); } int main() { printf("第一次调用"); aaa(); printf("第二次调用"); aaa(); return 0; }
输出结果:
3.register寄存器变量
register寄存器变量的作用就是可以将某个局部变量存放在计算机的某个指定的硬件存储器中,而不是内存中。
对于一个具备可以可移植性的程序来说,register的作用并不大
4.extern外部变量
一个工程由多个C语言文件组成,这些源代码文件会分别进行编译,然后链接成一个可执行模块。
而是用extern外部变量可以让一个变量在一个工程中的不同文件,进行声明和编译
//在a1文件中 #include <stdio.h> int main() { extern int a; printf("%d",a); renturn 0; } //在a2文件中 #include <stdio.h> int a=100; //注意两个文件一定要建立链接
运行a1文件的值为100
4.运算符和表达式
4.1基本运算符和算术表达式
另外对于除法运算符/,如果是两个整数,小数部分会被去除,只有其中一个为浮点数,结果才是浮点数;求余运算只适用于整数取余,两个运算变量只能是整型或字符型(ASCII)。其中,余数的结果由被除数决定,例如:8%(-3)=2,(-8)%3=-2
运算规则:先乘除后加减,求余运算与乘除同级
自增自减运算符
自增运算符前置,如++i,先将i的值加一,在使用加1后的值(先加1,后赋值)
自增运算符后置,如++i,先使用i当前的值,在加1(先赋值,后加1)
自减运算符同上
自增自减只能作用于变量,不能用于常量或表达式
比较自增、自减前置与后置的不同
#include <stdio.h> int main() { int a=10,b=10,c=a++,d=--b; printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d); return 0; }
输出结果:
4.2赋值运算符与赋值表达式
简单赋值
赋值符号“=”是赋值运算符,一般形式为:变量=表达式
a=b=c=0;
运算符是自右向左进行运算,所以上述赋值表达式等价a=(b=(c=0));
如果要对几个变量赋予同一个初值,可以采用 int a,b,c;a=b=c=0;也可以写成int a=0,b=0,c=0
但是不能写成int a=b=c=0;
复合赋值
复合算数赋值运算符包括:+=、-=、*=、/=和%=五种,a+=b等价于a=a+b
如果b是包含若干项的表达式,则相当于他有括号,例如:a+=b-3等价于a=a+(b-3)
赋值运算符为自右向左运算
4.3逗号运算符和逗号表达式
C语言中逗号可以作为分隔符‘,也可作为运算符,用于连接多个表达式逗号表达式在运算时将从左到右依次求取各个表达式的值,而整个逗号表达式的值为最后一个表达式的值。例如:
a=3,b=2; c=(a+b,a-b); //依次计算a+b和a-b的值,将a-b的值赋给变量C
逗号运算符在全部运算符里运算优先级最低,因此最好用圆括号括起来,否则意义可能不同
a=3,b=2; c=a+b,a-b; //c的值为5
如果前后表达式用到相同的变量,则前面表达式中变量值如果发生了变化,会影响后面的值,逗号运算符结合律为自左向右
a=2; c=(a*=4,a+12) //先计算a=a*4,再将加上12的值赋给C
4.4位运算符与位运算
所谓位运算是指进行二进制位的运算。位运算符包括按位与、按位或、按位异或、取反、左移和右移,其中取反时单目运算,区域都是双目运算,且参与位运算的运算量只能是整型或字符型的数据(按照ASCII码运算),不能是实型数据
1.按位与(&)
参与运算的两个数据,按照二进制位进行”与“运算。如果两个相应的二进制位都为1,则为1,否则为0。
2.按位或(|)
两个相应的二进制位只要有一个位1,该位的结果值为1
3.异或(^)
如果参与运算的两个二进制位相同,则结果为0,否则为0
4.取反(~)
用来对一个二进制数按位取反,0变为1,1变为0
取反公式:~x=-(x+1)
例如对正数进行取反操作
~8 二进制源码位0 1000 //最左边的0为符号位 二进制补码(正数不变)0 1000 取反操作1 0111 减1取反后得到二进制源码:0 1001 //因为是补码所以需要变回源码,而负数的补码操作是取反后加1 得到结果-9
对负数进行取反操作
~-9 二进制源码是1 1001 补码0 0111 //取反后加1 结果是8
5.左移运算符<<
用来将一个数的各个二进制位全部左移若干位,高位左移移除后舍弃。
公式为a<<n=a*2^n
6.右移运算符
用来将一个数的二进制位全部右移若干位,移到右端的低位被舍弃,对无符号数,高位补0
公式为a>>n=a/2^n
注意:位运算同样可以与赋值运算组成符合赋值运至运算符,例如&=,|=,<<=等
5.数据类型转换
5.1隐式类型转换
由编译系统自动进行,遵循三个基本原则:
1.参与运算的变量类型不同,则先转换成同一类型,然后进行运算
2.低级向高级转换原则
float型数据在运算时系统一律先转换成双精度类型在进行计算,以提高运算精度。
3.赋值运算两边的数据类型不同时,赋值号右边量的类型将转换位左边的
double a,b,c; int d; d=a+b+c; //计算结果转换位int类型,小数部分直接丢弃
5.2强制类型转换
将表达式的结果强制转换成类型标识符所指定的数据类型
运算格式为:(类型标识符)(表达式) //如果表达式为单个操作数,可以将括号省略
(double)a; (int)(x+y); (int)x+y; //将x转换成整型,然后与y相加
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120735.html









