【C语言】数据类型 数据类型转换 常量 变量 运算符和表达式(知识总结)

一. 数据类型

数据类型思维导图

1. 数据类型转换

(1)自动类型转换

不同类型的数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:

把占用内存空间的(低级)类型向占用空间的(高级)类型转换,以保证运算的精度

如图:
数据类型自动转换规则

  • 图中横向箭头表示必定的转换,如 char 型、short 型数据必定先转换为 int 型,float 型数据在运算时将先转换成 double 型,以提高运算精度(即使是两个 float 型数据相加,也要转换成 double 型,然后再相加)
  • 图中纵向箭头表示当经过横向的转换后,进行运算的数据类型仍然不同时的转换方式。在不同数据类型的转换过程中,类型转换顺序并不是按箭头方向一步一步的转换,可以没有中间类型转换。例,in t型与 double 型数据进行运算,先将 int 型的数据直接转换成 double 型,然后再进行两个同类型(double型)数据的运算
  • 转换只会影响表达式的运算结果类型,并不改变原变量的定义类型,并且其数据值也不会发生任何改变
  • 赋值运算符两边的运算对象类型不同时,也要发生类型转换,转换的规则是:把赋值运算符右边表达式的类型转换为左边变量的类型

(2)强制类型转换

(类型说明符) (表达式)

  • 功能:把表达式的运算结果强制转换成类型说明符指定的类型
    例如:

    #include<stdio.h>
    int main()
    {
          
          
    	int a=3,b=4;
    	float c;
    	c=(float)(a+b)/2;//将int型 7 强制转换为float型 7.0
    	printf("c=%f\n",c);
    	return 0;
    }
    

二. 常量

常量思维导图

1. 直接常量

(1)整型常量

即整数,包括正整数、负整数和零

a. 十进制表示
  • 由正负号和数字0~9组成,例 -123
b. 八进制表示
  • 由数字0(前缀)和数字0~7组成,例 045
  • 一般为无符号整数
c. 十六进制表示:
  • 由前缀0x0X和数字0~9或字母A~F(表示10~15,大小写均可),例 0x12cD
  • 一般为无符号整数

(2)实型常量

  • 即实数,又称浮点数,在C语言中只能用十进制表示
  • 实型常量默认为是 double 型的实数,在数的后面加上f或F(如1.23f)才认为是 float 型的实数
a. 小数形式表示
  • 由整数部分、小数点、小数部分组成,例 -12.34 ;
  • 当整数部分或小数部分为0时可省略不写,但小数点不可省略,且小数点前后至少一边要有数字,例 12. 和 -.123
b.指数形式表示
  • 由尾数部分、字母 eE 和指数部分组成,格式:±尾数E(e)指数,例 -1.2E-2,表示 -1.2 x (10)-2 ; 1.2e2,表示1.2 x (10)2

  • 字母E(或e)前后必须有数字并且指数部分只能是整数

(3)字符型常量

由单引号括起来的单个字符,如 ‘A’

  • 可以是ASCII字符集中的任意字符(即可像整数一样参加运算)
  • 每个字符在内存中占用一个字节
  • 转义字符 在内存中也只占用一个字节

(4)字符串常量

由双引号括起来的零个或多个字符序列,如"He MengYuan"

  • 字符串中可以使用空格字符、转义字符、空字符和其他字符,还有汉字等文字字符
  • 字符串常量在内存中占用一段连续的存储单元
  • 系统在每个字符串后面自动加上结束标志 ‘\0’,因此n个字符的字符串占用n+1个字节空间
  • 可用 sizeof 运算符(见四)来计算字符串占用的内存空间大小
  • 可用strlen()函数来计算字符串长度

2.符号常量

在C语言中可以用一个标识符来表示一个常量,称为符号常量,符号常量在使用前必须先定义,一般形式为:

#define 标识符 常量值 //#define 宏定义命令
例如:#define PI 3.14
//在需要3.14时使用PI就可以

三. 变量

变量思维导图

1. 字符型变量

char c1,c2;
  • 有数值特征,可以像整数一样参加运算
  • 允许对整型变量赋以字符值,也允许对字符变量赋以整型值
  • 允许把字符变量按整型量输出,也允许把整型量按字符量输出

2. 实型变量

关键字 类型 占用字节数 取值范围
float 单精度型 4 3.4E-38~3.4E+38
double 双精度型 8 1.7E-308~1.7E+308
  • 单精度型数据能保留7位有效数字,之后的数据无效
  • 双精度型数据能保留16位有效数字,但在VS中最多保留6位小数,第7位小数需进行四舍五入

例如:

#include<stdio.h>
int main()
{
    
    
	float a = 1234.567689456;
	double b = 1234.567895678;
	printf("a=%f,b=%f\n", a, b);
	return 0;
}

结果为:

a=1234.567749,b=1234.567896

3. 整型变量

关键字 类型 占用字节数 取值范围
short int 短整型 2 -32768~32767(-215~215-1)
int 整型 4 -2147483648~2147483647(-231~231-1)
long int 长整型 4 -2147483648~2147483647(-231~231-1)
unsigned short 无符号短整型 2 0~65535(0~216-1)
unsigned int 无符号整型 4 0~4294967295(0~232-1)
unsigned long 无符号长整型 4 0~4294967295(0~232-1)

注:以上数据只是在Visual C++2010环境下,各种类型的数据所占内存的大小随编译系统的不同而有差异

四. 运算符和表达式

运算符和表达式思维导图

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

(1)简单赋值运算符

等号 =

int a,b,c=1;
//等价于 
int a=1,b=1,c=1;
//但千万不能像下面这样写
int a=b=c=1;

(2)复合赋值运算符

运算符 应用举例 等价形式
+= a+=x a=a+(x)
-= a-=x a=a-(x)
*= a*=x a=a*(x)
/= a/=x a=a/(x)
%= a%=x a=a%(x)

(3)赋值表达式

变量=表达式

  • 如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型。
    例如:

    #include<stdio.h>
    int main()
    {
          
          
    	int a;
    	float b=123.456;
    	a = b;
    	printf("%d\n", a);
    	return 0;
    }
    

    结果为:

    123
    

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

(1)基本的算术运算符

运算符 + - * / %
名称 取余
  • / 除法运算符:在计算a/b时,如果a、b都为整型,其商也为整型,小数部分被舍去,例 1/2=0;如果a、b中有一个是实型,则a、b都转换为 double型,然后相除,结果为 double 类型,例1.0/2=0.5
    见下面一段代码:

    #include<stdio.h>
    int main()
    {
          
          
    	float a;
    	a = 1 / 2*3;//计算3的一半
    	printf("%f\n", a);
    	return 0;
    }
    

    我们理想的结果应该是:

    1.500000
    

    但为:

    0.000000
    

    正确代码应为:

    #include<stdio.h>
    int main()
    {
          
          
    	float a;
    	a = 1.0 / 2*3;//计算3的一半
    	printf("%f\n", a);
    	return 0;
    }
    
  • % 求余运算符:结果为两个数相除后的余数,要求参与运算的两个运算对象都必须是整型,其结果也是整型,例7%2=1;求余运算结果的符号第一个操作数符号相同,例7%-2=1

(2)自增、自减运算符

  • 自增运算符:使变量的值加一(下面以 i 为例)
    i++:先使用后加1
    ++i:先加1后使用
    区别:

    #include<stdio.h>
    int main()
    {
          
          
    	int i=1;
    	printf("i=%d\n",++i);//打印i的值
    	printf("i=%d\n",i++);//打印i的值
    	return 0;
    }
    

    运行结果:

    i=2
    i=2
    
  • 自减运算符:使变量的值减一
    i- -:先使用后减1
    - -i:先加1后使用
    区别:与自增类似

(3)算数表达式

由算术运算符、运算对象和括号连接起来的式子,运算对象可以是常量、变量、函数等

  • 表达式计算后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对象决定,例:有定义“char a=0;int b=1;float c=2;double d=3;”,则表达式“a+b+c+d”的值为 double 类型
  • 乘号不能省略
  • 可用多层圆括号且只能用圆括号

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

(1)逗号运算符

逗号也是一种运算符,它的功能是把多个表达式连接起来组成一个表达式,即逗号表达式

(2)逗号表达式

表达式1,表达式2,… ,表达式n

  • 执行顺序:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值

  • 并非所有出现逗号的地方都为逗号表达式,有的时候逗号只是用作各变量的分隔符
    代码示例:

    #include<stdio.h>
    int main()
    {
          
          
    	int i,j=7;
    	float k = 5;
    	i = (j = j + 2, j / k);
    	printf("i=%d\n",i);
    	return 0;
    }
    

    运行结果:

    i=1
    

4. 求字节数运算符

sizeof(表达式)或sizeof 表达式
sizeof(数据类型名)

代码示例:

#include<stdio.h>
int main()
{
    
    
	int a, b;
	a = sizeof(3 + 5.0);
	b = sizeof 3 + 5.0;
	printf("%d,%d,%d\n", a, b, sizeof("china"));
	return 0;
}

运行结果为:

8,9,6

在VS2022中:

#include<stdio.h>
int main()
{
    
    
	printf("%d\n", sizeof(char));//1
	printf("%d\n", sizeof(float));//4
	printf("%d\n", sizeof(double));//8
	printf("%d\n", sizeof(short int));//2
	printf("%d\n", sizeof(int));//4
	printf("%d\n", sizeof(long int));//4
	printf("%d\n", sizeof(unsigned short));//2
	printf("%d\n", sizeof(unsigned int));//4
	printf("%d\n", sizeof(unsigned long));//4
	return 0;
}

5. 关系运算符和关系表达式

(1)关系运算符

运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于

(2)关系表达式

表达式1 关系运算符 表达式2

  • “=”为赋值运算符,表赋值;“==”为关系运算符,表判断
  • 非0为真,0为假,假为0,真可能为1,例:关系表达式“(a=3)>(b=8)”的值为 0
  • 对实数进行相等判断可能得不到正确的结果,例:“1.0/3*3.0==1.0”的结果为0

6. 逻辑运算符和逻辑表达式

(1)逻辑运算符

运算符 && ||
名称 逻辑非 逻辑与 逻辑或

(2)逻辑表达式

表达式1 逻辑运算符 表达式2
或 逻辑运算符 表达式1

  • 在由若干子表达式组成的逻辑表达式中,从左到右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况被称为“短路”
  • && 左右有一个表达式为假,结果为假
  • || 左右有一个表达式为真,结果为真

7. 条件运算符和条件表达式

(1)条件运算符

由“ ?”和“:”两个符号组成

(2)条件表达式

表达式1 ?表达式2 : 表达式3

  • 执行顺序:先计算表达式1的值,若值为非0,表达条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。例,4>3?5:7 的值为5
  • 条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例,“ ‘a’?1:2.0”的结果为double型的1.0
  • 循序嵌套:“a>3?b:c>2?1:0”,根据条件表达式的右结合性,它相当于“a>3?b:(c>2?1:0)”

猜你喜欢

转载自blog.csdn.net/m0_74102736/article/details/129890527