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。一旦定义了符号常量,之后有使用这些符号常量的地方都会被常量值取代。
    • 人们习惯用大写字母来表示符号常量,用小写字母来表示变量名。

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语言的数据类型确实很多,我也花了很长时间去记它,希望以后不要忘了。

posted on 2023-03-01 00:31  嗷呜ニャー~  阅读(204)  评论(0编辑  收藏  举报