C语言复习————基本数据类型、运算符和表达式

  • 2019 年 10 月 8 日
  • 笔记

数据类型/运算符/表达式

主要分两部分介绍,第一部分介绍常用的数据类型,例如:常量和变量/整型/实型/字符型;第二部分介绍算数运算符和算数表达式以及赋值运算符和逗号运算符。

一. 常用的数据类型

1. C语言中的数据类型

数据类型

C语言中基本数据类型主要有整型/实型/字符型/字符串型,本节主要介绍这几种基本的数据类型,以及数值型数据之间的混合运算

2. 数据类型保存的范围

C语言中数据类型所占的字节数,与操作系统和编译器都有关,C语言提供了sizeof操作符来查看某个类型变量在计算机内存中占多少字节

这里给出一张速查表方便查询

3.常量/变量和保留字

​ C语言中有常量,变量还有保留字

常量:程序运行中,其值不能被改变的量;eg:150

变量:可以改变的量,介绍变量之前,先了解下表示符,标识符:类似与人的名字,由字母/数字/下划线组成,第一个字符必须是字母或者下划线,变量名就是一个表示符,而且区分大小写

保留字:系统保留起来,有特殊用途,C++中一共由74个保留字,如下图所示

保留字

4. 整型/实型/字符型/字符串型

​ 1) 整型数据即整数

//整型变量的定义  int a, b, c;  unsigned int d, e, f;  // 定义变量的时候初始化  int k = 189;  //在一个常数后边加一个字母U,表示该常数用无符号整型方式存储,相当于unsigned int  //在一个常数后边加一个字母L,表示该常数用长整型方式存储,相当于long  //在一个常数后边加一个字母F,表示该常数用浮点数方式存储,相当于float  //小数会被截断  int test2 = 23.12F;  

​ 2) 实型数据

//十进制浮点数表示形式  0.12; 3.1415926;  //指数形式表示的浮点数  浮点数在内存中以指数形式存储 具体如何存储的  用处不大  //168E+2 ====>  16800   168E-2 1.68  float ab = 168E-2;  //实型变量  //float:单精度变量  一般提供7位有效数字(保守估计6位)  //double:双精度变量 一般提供15-16位有效数字(保守估计15) 这个数字根据机器而定    //关于精度问题,有效数字  12345.678;  // 10000.0 只有一位有效数字导致此结果  这就是精度问题  // 12000.0 有两位有效数字导致此结果  // 12300.0 有三位有效数字导致此结果  // 12345.67X 有七位有效数字导致此结果    0.1234;  // 0.1XXX 只有一位有效数字  // 0.12XXXX 只有两位有效数字    //十进制数转换成二进制   然后把二进制在转换成十进制  转换中存在除法  会导致如下精度丢失问题  float af1 = 0.5;       // 0.500000000  float af2 = 0.51;      // 0.509999990

有效范围

​ 3)字符型数据

//常规字符: 用单引号引起来的一个字符;  'a'; '$', 'b';  //特殊字符:转义字符,以开头的字符序列, n换行  常用的转移字符  'n', ''', '\', '"';  //字符变量:只能保存一个字符,因为一个字符型变量在内存中只存在一个字符  //实际上是把字符对应的ASCII码放到了变量所代表的变量的内存中  char x1, x2;  x1 = 97; //x1 = 'a'  x2 = 98; //x2 = 'b'  printf("c1 = %c, c2 = %cn", x1, x2); //%c以字符的形式输出  x2 = x2 + 4;  // 102 f  printf("c1 = %c, c2 = %cn", x1, x2); //%c以字符的形式输出  

说到字符不得不说一下转义字符,在这里列出ASCII码表

4) 字符串型

//字符串常量:用一对双引号引起来的一堆字符,可以是一个字符,也可以是多个字符  "hello world"  //字符串变量  //不要混淆‘a’,"a"; 单引号引起来的是字符  双引号引起来的是字符串  //单引号a 和 双引号a的区别   'a': a   "a": a ''  //表示字符串结束标记,但是在printf的时候 并不输出出来  printf("abcdefaaaaaaaaaan");   //abcdef  printf("n");  printf("qqabcdef123565n");   //    后面跟数字  被当作八进制数  printf("abcdefghn"); // 自动在末尾

5) 变量赋初值

int qq = 3;  int q, w, ee = 6; //只给ee赋初值,对于没赋值的变量,其值是不确定的,不能随意拿过来用  //变量必须先定义后使用

5.数值型数据之间的混合运算

原则:

//数值型数据之间的混合运算  int ax = 500;  double ada = 15.67;  double def = ax + ada; //系统把Int转换成double,然后和原来的double相加      

二. 算数运算符和表达式

1. C语言中的运算符

1)C语言中一共13中运算符

2) C语言中运算符的优先级问题


2.算数运算符和算数表达式

​ 1)算数运算符就是平时所说的加减乘除求余等运算,算数表达式是由算数运算符组成的表达式

////(1)算数运算符和算数表达式  //// + - * / %(取余也叫模运算符,该运算符两侧都要求为整数)  //printf("表达式的结果%dn", 5/3); //两个整数相除,系统会舍弃小数部分  //printf("表达式的结果%dn", 5%3);

​ 2)算数运算符的优先级

//运算符优先级问题:先乘除,后加减,如果优先级相同,则先计算左边,再计算右边,(从左到右结合)  //2 + 3 * 5;  //printf("2+3*5 = %dn", 2 + 3 * 5);    ////赋值运算符  //int i;  //i = 4; //把等号右边的变量赋值给左边的变量  //i = 4 + 3; // ==> i = (4+3) 括号的优先级最高 如果搞不懂优先级,那么就用括号运算符把需要优先运算的内容括起来  //  ////int a;  ////a += a += a /= a + 6;//

3.强制类型转换运算符

类型转换分为两种,

​ 1)自动类型转换:系统替程序员转换

​ 2)强制类型转换:自动类型转换达不到目的时,就用强制类型转换

强制类型转换运算符,将一个表达式转换为所需要的类型   ((类型)) 优先级挺高的  ////强制类型转换得到的是中间变量  ////有些书籍不建议写成int(a),实际如果写成int(a)也是可以的  //int a;  //double b;  //b = (double)a; //这属于强制类型转换 但是a本身的类型并没有变化  而是结果发生了变化      ////(int)(a+b)  将a+b的值转换为整型;  ////总结强制类型转换运算符的一般形式 (类型名)(表达式)  //// (int)x + y; // 只讲x转换成了整型,然后和y相加了  float x;  int i;  x = 3.6f;  i = (int)x; //3  printf("x = %f, i = %dn", x, i);  

4.自增自减运算符

​ 自增和自减操作符 ++ — 经常用

​ 只能用于变量,不能用于常量表达式,比如错误的用法:++5

​ 当自增或者自减运算符在变量后边的时候,对于该自增或者自减表达式的使用是,先用后加

i = 6;  //相当于i自身加1,然后结果值在赋值给i  //++i; // 先加后用  //i++; //  先用后加  //如果++i或i++单独写成一个语句,没有任何区别,都是将变量自身+1,没有区别,但是如果放在函数调用中,结果就会不同  printf("i++的结果是%d %dn",i++,i); // 先用后加,i++结果为6 i本身为7  printf("++i的结果是%d %dn",++i,i); // 先用后加,i++结果为8 i本身为8  //表达式: 理解为+-*/串起来的一个式子  //-i++ ==> -(i++)  //i+++j; // ==> (i++)+j;c编译器在处理时会尽可能多的从左到右将若干个字符组成一个运算符 

5.赋值运算符和赋值表达式

    //1 赋值运算符      //赋值运算符和赋值表达式  = 将等号右边的值赋给等号左边的变量      // = 左边 是个变量 所谓这个赋值, 可以理解位给变量一个值,或者是改变变量到某一个值      int a;      a = 5;      a = 6.5; //将实型数据赋给整型变量时,小数部分会被设置 a = 6;      a = 18 + 50;      a = a + 3; //73        float f;      f = 125; // 1.25E2 实型变量按指数形式保存在内存中的      // 几个概念      //char a; //变量定义  系统给a分配一个字节的内存,内存里的之不确定      char b = 90;//变量定义同时赋初值,也叫定义时初始化  -128-=127      b = 900;//赋值语句  会溢出  溢出后a里面的内容,就变得不可预料了      //赋值的原则,尽量保证类型相同,类型不同的用强制类型转换,当用强制类型转换时,必须明确知道不会溢出      int c;      c = (int)23.5;        int d;      d = 1000000 * 1000000; //溢出          //2. 复合的赋值运算符:在赋值运算符之前加上其它运算符,构成了复合的赋值运算符(复合的赋值运算符之间必须紧挨着不能用空格分开)      int e= 8;      e += 3; // e = e + 3;        int x = 2, y = 8;      x *= y + 8; // x = x * (y+8);如果*=右侧是个表达式的话,则相当于表达式有括号      x %= 3; // x = x % 3;        //3. 赋值表达式 本身也是有值的 赋值运算符从右到左运行      int z = 4;      printf("z = 5这个赋值表达式的值是%dn", z = 5);      printf("z += 8这个赋值表达式的值是%dn", z = 5);        int aaa,bbb;      aaa = (bbb= 5); // aaa = 5; bbb = 5;        int ccc = 23;      aaa = bbb = ccc ;        aaa = 3;      aaa += a -= a*a;// a+= (a -= (a*a)) -12

6.逗号运算符和逗号表达式

      //4. 逗号运算符和逗号表达式      int a;      a = (4,5);//5      a = (3+5,6+8);//14      a  = 3*5,a*4; // a = 15 表达式为60      result = (a  = 3*5,a*4); //result 60 a=15      //逗号表达式的扩展形式:      //表达式1,表达式2,表达式3,……,表达式N,最终的值是表达式N的值        int x,a;      x = (a = 3,6 * 3);// a = 3, x = 18      x = a = 3, 6 * a;//a = x = 3; 表达式结果为18