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语言的数据类型确实很多,我也花了很长时间去记它,希望以后不要忘了。
C语言学习记录(三)的更多相关文章
- Go语言学习笔记三: 常量
		Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ... 
- JavaScript学习记录三
		title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ... 
- 3.VUE前端框架学习记录三:Vue组件化编码1
		VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ... 
- leveldb 学习记录(三) MemTable 与  Immutable Memtable
		前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ... 
- C 语言学习 第三次作业总结
		本次作业内容: For循环的使用 If判断语句的使用 常用数学运算表达式的使用 数学函数库中几个常见函数的使用及自我实现 将操作代码提交到coding 作业总结: For循环是C语言中一种基本的循环语 ... 
- 【GO】GO语言学习笔记三
		7.数组: 几乎是最常用的数据类型了... 数组就是指一系列同一类型数据 的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度. 常规的数组声明方法: ... 
- 学习iOS笔记第一天的C语言学习记录
		c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 ... 
- webrtc学习———记录三:mediaStreamTrack
		参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ... 
- C语言学习第三章
		写在课前,提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号! 今天主要学习掌握if...else条件结构,多重if条件 ... 
- Go语言学习笔记(三) [控制结构、内建函数]
		日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语 ... 
随机推荐
- 接口自动化库-apist
			前言 目前很多公司用jmeter或者RF框架来实现接口自动化,确实是可以实现,但不利于CI/CD. 为了方便后续的可拓展性.可维护性.可复用性,项目leader在技术选型的时候应当以趋势.主流的为主, ... 
- Vue 关键概念介绍
			Vue现在已经迭代到 3+ 版本,阅读官方文档的过程中发现作者的一些理念和思路很合我口味,很多概念与方案都是基于解决实际问题提出并实现的,且在权衡利弊后勇于打破常规,比如如何看待关注点分离?.可见,V ... 
- STM32L431 移植 LiteOS 时 _ebss _Min_Heap_Size _Min_Stack_Size 未找到或未定义
			将 LiteOS 移植完成之后,编译报如下错误: 环境 版本 Keil V5.37.0.0 Windows11 2022/12/22 ARM::CMSIS 5.9(2022-05-22) 开发板 ST ... 
- OpenLayers入门练习
			一.实验内容 练习OpenLayers的引用形式; 简单地图加载; 控件加载. 二.实验步骤 2.1 ol引用 <!doctype html> <html lang="zh ... 
- 遗忘的pawn 创建
			默认加载 pawn::staticclass; ConstructorHelpers::FClassFinder<>Pawnpath(TEXT("_C")); 然后是的 ... 
- 疑问:如何替代dtb文件
			学习设备树,想添加自己定义的节点,编译好了,但不知道如何替代原来的dtb文件 
- 洛谷P2205 [USACO13JAN]Painting the Fence S
			题目 https://www.luogu.com.cn/problem/P2205 思路 刷水题真解压 差分就完事了 值得注意的一些东西:像这种和数轴或者坐标相关的题,还有扫描线题,一定要注意区间的开 ... 
- pwn基础
			pwn常用工具 1.IDA 是一个世界顶级的交互式反汇编工具,主要用来静态分析. 使用F5即可将汇编反编译成易于阅读的伪代码:空格键:文本,图形和反汇编窗口的切换:ESC:退到上一个操作地址:F7:单 ... 
- R Works with Google Earth Engine - Installation 【rgee - 安装问题解决集锦】
			Date : 2022/04/24 Intallation Tutorial - Reference : Introduction to rgee (r-project.org) Prerequisi ... 
- 2.3	在DispatcherServlet的构造方法中解析applicationContext.xml配置文件
			package com.hy.servlet; import java.io.IOException; import java.io.InputStream; import java.util.Map ... 
