C语言学习记录(三)
C语言学习记录(三)
一、知识要点(数据类型、运算符与表达式)
1、C语言的数据类型
- C语言数据结构有:基本类型、指针类型、构造类型和空类型。其中基本类型:查看书籍的22页表3-1。
- C语言的基本数据类型可以直接用来定义常量和变量,但是构造类型需要自己构造。
- C语言在处理常量和变量时,储存常量的内存单元是不能被改变的,而变量则可以改变。
2、常量
-
整形常量:表示一个确定的整数。
-
十进制整数:由0~9的数字序列构成,可加正负号。
-
八进制整数:必须以0开头,可加正负号。
-
十六进制整数:必须以0x或0X开头,可加正负号。
-
整数的后缀
-
整型常量的尾部加上L或l表示此为长整型常量。
-
尾部加上U或u表示无符号整数常量。
-
L和U可以同时使用,顺序任意。
-
-
-
浮点型常量:也就是实数。
-
十进制小数形式:由数字、小数点和正负号组成。
-
指数形式:由数字、字母e和正负号组成,形式为aEn,意为a*10n,其中a为十进制整数或小数,n为十进制整数。
-
a和n都不能省略,n必须为整数。
-
整数和小数部分可省略其中一个,例:.35、26.
-
浮点常量默认为double类型,在尾部加F可变为float类型。
-
实数在机内的储存形式
数符 小数部分 指数符号 指数部分
-
-
-
字符常量:属于ASCII码中的常量。
- 使用单引号括起来的字符,如‘a’
- 转义字符:用来控制的字符常量,以\开头,在屏幕上不显示。常用转义字符详见课本25页表3-2。特别注意,\ddd代表1~3位八进制自负,如'\012'。\xhh代表十六进制,如'\x12'。
-
字符串常量:字符串常量是由双引号括起来的字符序列,字符串在机内储存时末尾的一个字节用来存放\0。
-
符号常量机器定义:C语言提供了一种利用标识符来代表一个常数的方法,即定义符号常量。
- C语言使用#define定义符号常量,格式为
#define PI 3.14
,指PI的数为3.14。一旦定义了符号常量,之后有使用这些符号常量的地方都会被常量值取代。 - 人们习惯用大写字母来表示符号常量,用小写字母来表示变量名。
- C语言使用#define定义符号常量,格式为
3、简单变量
-
变量的命名
- 变量的值在程序运行过程中是可以改变的。
- 变量需要一个名字,以便对其引用。变量名以一个名字分配一个内存单元。访问变量的值,实际上是通过变量名找到相应的内存地址,然后进行访问。
- C语言中,对变量、符号常量、函数、宏、标号、文件名等命名的有效字符称为标识符。标识符由字母、数字和下划线组成,且必须以下划线或字母开头。
- 关键字不能作为变量名使用,如int这些。
-
变量的类型定义
- 变量的数据类型决定了该变量的取值范围、取值类型、占空间大小等。
- 变量必须先定义再使用。
-
变量的初始化
-
#include <stdio.h> int main() { int i; printf("%d\n",i); return 0; } //输出了不确定值
-
从上述例子看出,变量定义后要初始化,不然计算机会赋予它不确定值。
-
在同一程序块中,不能有两个相同的变量名。
-
C语言中没有字符串变量类型。
-
4、库函数
-
库函数的使用方式
-
C语言每个库函数都在对应的某个头文件声明其函数原型,文件包含可以用预处理命令
#include
来实现。 -
例如,数学函数的原型都在文件math.h中,如果要调用数学库函数函数可以用
#include <math.h>或#include "math.h"
来实现。 -
C语言函数调用的格式语法为:函数名(实参列表),如果是调用无参函数,那么直接写括号就行了。
-
#include <stdio.h>//计算三角形面积 #include <math.h> int main() { double a = 3.5, b = 4.5, c = 5.5;//a,b,c表示三角形三条边 double p, s; p = 0.5 * (a + b + c); s = sqrt(p * (p - a) * (p - b) * (p - c));//用劳伦公式计算面积 printf("area=%lf", s); return 0; }
-
-
常用数学函数
-
三角函数sin,cos,tan
-
原型:
double sin(double x );double cos(double x);double tan(double x);
-
功能:函数sin,cos,tan分别用于计算正弦、余弦和正切值,且参数都是代表弧度值的double函数。
-
#include <stdio.h>//计算sin,cos,tan的值 #include <math.h> #define PI 3.1415926 int main() { double x, y; x = 0.5 * PI; y = sin(x); printf("sin(%lf)=%lf\n", x, y); x = 0; y = cos(x); printf("cos(%lf)=%lf\n", x, y); x = 0.25 * PI; y = tan(x); printf("tan(%lf)=%lf\n", x, y); return 0; }
-
-
绝对值函数abs,fabs,labs
-
原型:
int abs(int x);double fabs(x);long labs(x);
-
功能:abs、fabs和labs分别用于求整数、浮点数和长整型数的绝对值,返回参数x的绝对值。
-
#include <stdio.h>//计算x,y,z的绝对值 #include <math.h> int main() { int X,x = -1; double Y, y = -0.234; long Z,z = -99999; X = abs(x); Y = fabs(y); Z = labs(z); printf("%d %lf %d ", X, Y, Z); return 0; }
-
-
exp和pow函数
-
原型:
double exp(double x);double pow(double x);
-
功能:exp函数返回以e为底,参数x为幂的指数值ex;pow函数返回x的y次幂xy。
-
#include <stdio.h>//计算e的a次方和b的c次方 #include <math.h> int main() { double a, b, c, A, B; scanf("%lf%lf%lf", &a, &b, &c); A = exp(a); B = pow(b, c); printf("e^%.2lf=%.2lf\n%.2lf^%.2lf=%.2lf",a, A,b,c, B); return 0; }
-
-
log和log10函数
-
原型:
double log(double x);double log10(double x);
-
功能:log函数返回以e为底,参数x的自然对数值lnx;log10函数则为log10x。
-
#include <stdio.h>//计算lnX和logX #include <math.h> int main() { double x, y, a, b; scanf("%lf%lf", &x, &y); a = log(x); b = log10(y); printf("ln(%.2lf)=%.2lf\nlog(%.2lf)=%.2lf", x, a, y, b); return 0; }
-
-
sqrt函数
-
原型:
double aqrt(double)
-
功能:aqrt函数返回参数x的平方根
-
#include <stdio.h>//计算根号x #include <math.h> int main() { double x, y; scanf("%lf", &x); y = sqrt(x); printf("根号%.2lf=%.2lf", x, y); return 0; }
-
-
随机函数rand,srand
-
rand和srand函数的原型在头文件 stdlib.h中定义。函数原型:
int rand(void); void srand(unsigned int seed)
-
功能:rand函数返回一个值在0~RAND_MAX之间的伪随机整数,其中RAND_MAX至少为32767。srand函数用来设置随机数的起始点,参数seed是随机数种子。
-
#include <stdio.h>//用当前时间机器做种子,产生4个随机数 #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); printf("%6d\n", rand()); printf("%6d\n", rand()); printf("%6d\n", rand()); printf("%6d\n", rand()); return 0; }
-
-
-
字符输入输出函数
-
函数原型在头文件stdio中
-
字符输出函数putchar
-
原型:
int putchar (int c);
-
功能:把一个字符输出到显示屏上,其中参数c可以是字符变量或常量,也可以是代表ASCII码的整数。
-
#include <stdio.h>//输出单个字符 int main() { char c1 = 'A', c2 = 65, c3 = '\x41'; putchar(c1); putchar(c2); putchar(c3); putchar('\n'); putchar(36); putchar('3'); return 0; }
-
-
字符输入函数getchar
-
原型:
int getchar (void);
-
功能:getchar函数从标准输入设备的输入流中获得一个字符。调用该函数时不用参数。
-
#include <stdio.h>//利用getchar函数输入一个字符 int main() { char ch; ch = getchar();//将输入的字符赋予ch putchar(ch); return 0; }
-
-
-
格式化输入输出函数的一般使用
-
格式化输出函数printf
- 普通字符在输出时按原样输出,转义字符则输出所代表的字符。
- 输出:int→%d,float→%f,double→%lf,char→%c,字符串→%s。
- 在printf函数中,可以可以控制输出数据的长度,格式为%md或%m.nlf或%ms,m表示非负整数。当m小于输出数据长度时,m将不起作用。
-
格式化输出函数scanf
-
字符输入和printf函数一样。
-
#include <stdio.h>//利用getchar函数输入一个字符 int main() { int i, j; float x, y, z; printf("请输入数字赋予i和j:"); scanf("%d%d\n", &i, &j); printf("请再次输入数字赋予x、y和z:"); scanf("%f%f%f\n", &x, &y, &z); printf("i=%d,j=%d,x=%f,y=%f,z=%f", i, j, x, y, z); return 0; }
-
程序中&i、&j中的&表示地址运算符,用于取地址。
-
scanf括号里双引号的符号在输入时必须要原样输入。
-
-
使用格式化输入函数scanf常见的几个问题
- scanf函数中的地址表应填变量的地址,而非变量名。
- 在用%c输入字符时,空格符和转义字符都会作为有效字符输入,从而引起错误。
- 当连续使用多个scanf函数输入数据时,会发生数据残留问题,具体操作观看本书39页。
-
5、运算符和表达式
-
C语言中的表达式是由操作符(运算符)和操作数(运算量)组合成的式子,来描述操作顺序。操作数可以是常量或者变量或者函数。并且表达式的计算将返回一个具有确定类型的值。
-
C运算符的种类、运算优先级和结合性
- 运算符的种类:在后面会仔细讲解。
- 优先级:初等运算符([],(),->)→单目运算符→算数运算符→逻辑运算符→赋值运算符→逗号运算符
- 结合性
- 左结合性:运算顺序先左后右,算术运算符就是左结合性。
- 右结合性:运算顺序先右后左,赋值运算符就是右结合性。
- 说明
- 相同优先级的运算符,运算次序由结合性决定。
- 各种操作符对操作数个数的要求不一样,有的是两个(双目运算符),有的是一个(单目运算符),有的还是三个。
-
算术运算符和算术表达式
- 算术运算符
- 五个算术运算符:*、/、+、-、%(求余)。
- 都是双目运算符,且都为左结合性。
- 算术表达式
- 求余运算%前后两个操作数都必须为整形数据,当两个操作数为正时,结果为正,如果其中一个为负时,不同的编译器结果不同。
- 整数除:结果只会显示整数部分,小数部分被舍弃,且不进行四舍五入。
- 实数除:只要两个相除数有一个是实数,那么结果就是实数。
- 各类型数值混合运算
- C语言允许整形、浮点型和字符型数据混合运算。
- 在c语言算数表达式中,如果参加运算的操作数不一致,那么将会转化为一致的类型后在进行运算,且是低级转化为高级数据,规则为:char,short→int→unsigned→long→(float)double→long double
- 算术运算符
-
赋值运算符和赋值表达式
-
赋值运算符
- C语言中的简单赋值运算符是=,而等于是==,切莫搞混。赋值表达式是变量名=表达式,意思是把表达式存在变量名地址所指的存储单元中。
- 赋值运算符左侧的操作数称为左值,它必须指明一个确定的可存储位置。如a + b =3是错误的。
- 赋值运算符具有右结合性。
-
复合赋值运算符
- C语言规定可以使用十种运算符:*=、/=、%=、+=、-=、>>=、<<=、&=、^=、|=。这些运算符优先级都相同,也都是右结合性。他们都高于逗号运算符,低于其他所有运算符。
- 复合赋值运算符的含义:a+=5指的是a=a+5,其他的也是这样。
-
赋值类型转换
- 将浮点型变量赋给整型变量时,舍弃小数部分。
- 将double数据赋给float数据时,截取前面七位有效数字,存到float中去,反之则扩展到十六位。
- 当长整型数赋给短整型变量时,截取低位传送,反之则扩展。
-
强制类型转换
-
此转换符可改变数据符类型,格式为:(类型名)表达式。如(double)i
-
#include <stdio.h>\\精度损耗问题 int main() { double x = 3.6; int i; i = (int)x; printf("x=%lf,i=%d", x, i); return 0; }
-
-
-
增量运算符和增量表达式
- 增量运算符(单目运算符)有++,--。
- 前缀运算:先增值,后运算:i=1;j=++i;
- 后缀运算:先运算,后增值:i=1;j=i++;
- 运算注意事项
- ++和--只能用于变量,不能用于常量或表达式。
- 此运算符结合方向是右结合性。
- 建议不要连续使用多个增量运算符,不然别人很难搞懂你写的是啥。
-
关系运算符和关系表达式
- 关系运算符
- C语言中有六个关系运算符:<,<=,>,>=,==(等于),!=(不等于)。
- 这些都是双目运算符,且都是左结合性,关系运算符的级别低于算术运算符,高于赋值运算符。
- 关系表达式:关系表达式的值是一个逻辑值,只有真和假两种。
- 如果关系表达式成立,那么真值为真,C语言中用1表示。
- 反之则真值为假,用0表示。
- 关系运算符
-
逻辑运算符和逻辑表达式
-
逻辑运算符
- C语言有三个逻辑运算符,他们是:&&(逻辑与)、||(逻辑或)、!(逻辑非),其中&&和||是双目运算符,!是单目运算符;前两者为左结合性,后者为右结合性。
- 有一种表归纳了逻辑运算的规则,叫真值表(学过离散就知道,不必多说)
-
逻辑表达式
-
逻辑表达式的值是一个逻辑值(真和假)在判定一个量是否为真或假时,C语言规定以0表示真,以非0表示假。比如a=3是真。
-
判断x是否属于区间[a,b]在C语言中不能写成a<=x<=b,应当写成a<=x&&x<=b。
-
不完全计算
-
在一个&&的表达式中,若&&左端为假,则不再计算另一端,该值肯定为假。
-
在一个||表达式中,若||左端为真,则不再计算另一端,该值肯定为真。
-
#include<stdio.h>//不完全计算问题 int main() { int a, b, c, d; a = 0; b = 1; c = a++ && b++; d = a++ || b++; printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d); return 0; }
-
-
-
-
条件运算符和条件表达式
-
格式为表达式1?表达式2:表达式3。这是C中唯一一个三目运算符,意思是如果表达式1的值为真,那么取表达式2的值,否则取表达式3的值。
-
这三个表达式类型可以互不相同,当表达式2和表达式3的数据类型不同时,则最后的值转化为两者中类型高的数据类型。
-
#include<stdio.h>//比较两个数大小 int main() { double a, b, max; printf("Please input two real numbers:"); scanf("%lf%lf", &a, &b); max = (a > b) ? a : b; printf("max=%lf\n", max); return 0; }
-
-
逗号运算符和逗号表达式
-
C语言中逗号有时也是运算符,称为逗号运算符,也称为顺序求值运算符,用于将多个表达式连接起来,格式为表达式1,表达式2,……表达式n。
-
求值过程是:从左到右依次对各个表达式求值,只取最后一个表达式的值。逗号表达式的优先级是最低的。
-
#include<stdio.h>//逗号表达式的实例 int main() { int i, j; j = (i = 2, i++, i++); printf("i=%d,j=%d\n", i, j); return 0; }
-
-
位运算符
-
位运算指的是对二进制数的位进行运算,C语言中,有六种位运算符,其优先级从高到低为:~、<<、>>、&、^、|。注意,位运算符只适用于字符型和整数型数据,对其他数据类型不管用。
-
按位与运算符(&)
- 就是将两个数的二进制位都相与。
- 按位与通常用来对某些位清零或保留某些位。比如把整数a的高八位清0,保留低八位:a&255(255的二进制位(0000 0000 1111 1111)。
-
按位或运算符(|)
- 就是将两个数二进制相或。
- 常用来把数据的某些位定值为1。比如把整数a的低八位定值为1,高八位不变,可做a|255运算。
-
按位异或运算符(^)
-
就是将两个数相异或。
-
可以实现两个值的交换:
-
a=10100001,b=00000110 a=a^b;//a=10100001 b=a^b;//b=10100001 a=a^b;//a=00000110
-
-
左移运算符(<<)
- 比如a<<4就是把a的各个二进位全部左移四位。高位丢弃,低位补零。
- 对某个数左移一位相当于把这个数乘2,左移四位就是乘24。
-
右移运算(>>)
- 和左移差不多,右移就是除2。
-
#include<stdio.h>//位运算实例 int main() { unsigned a, b; printf("input a number: "); scanf("%d", &a); b = a >> 5; b = b & 15; printf("a = % d, b = % d\n", a, b); return 0; }
-
不同类型数据的混合运算时,会将运算对象右端对其。
-
-
求字节数运算符sizof:可以求返回运算对象所占内存空间的字节数。
2、学习心得
不得不说,c语言的数据类型确实很多,我也花了很长时间去记它,希望以后不要忘了。