L1D2:C语言之数据类型、常量、变量及运算符

一、C语言数据类型分类

C语言数据类型大致分类如下图所示:
在这里插入图片描述
1、 char类型(1字节):范围-128 ~ 127,-128补码为1000000,char前面加unsigned的话变成无符号型,范围变成0 ~ 255。(编程时一定要注意数据范围,因为数据越界在程序中是不会报错的,加<limits.h>头文件可以查看各个变量的界限)
2、 short类型(2字节):有符号时范围,-32768~32767 无符号时的范围:0~65535
3、 int类型(4字节):分有无符号型 有符号范围:-231~231-1 无符号范围:0-2^32-1
4、 long类型(4字节)等同于int么
5、long long类型(8字节 64位)
6、float类型(4字节):单精度浮点
7、double类型(8字节):双精度浮点

除此之外,还有bool类型,此类型需要添加头文件<stdbool.h>(本质情况是bool不需要加头文件,而是true和false需要这个头文件),非0为真。

二、数据类型强制转换

1、 强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来
2、 强制类型转换符是一种不安全的转换,一般都是将高级类型转换成低级类型,要丢失数据的精度
3、 强制类型转换并不改变表达式本身的数据类型

如下程序:

#include <stdio.h>

int main(int argc , char *argv[])
{
	int a = 3;
	int b = 2;
	float div = 0;
	div = (float)a / (float)b;
	printf("value b is :%f\n",div);
	return 0;
}

如果不对a、b进行强制转换输出结果为1,强制转换后输出结果为1.5
在这里插入图片描述

三、常量

3.1基本数据类型的常量

1、 整型常量:即整数
2、 浮点常量:实数 分一般形式和指数形式,指数形式:1.176e+10代表1.176×10^10
3、 字符常量:‘a’ 字符常量就是对应ASCII码表中的整数 ‘0’是对应码表的0x30
4、 字符串常量:“abcd13k”

3.2标识常量

#define <标识常量名称>	<常量>

四、变量

4.1 变量的基础

变量名不能以数字开头,不能和关键字重名,在满足这两个条件情况下,根据用户需求自行定义变量名。

4.2 变量的说明

<存储类型> <数据类型> <变量名>
存储类型是关键字:auto、register、static、extern、volatile等

4.3 变量的存储类型

1、 auto是局部变量,在函数体内(某个程序范围内)使用,这也是默认类型(默认随机值)。
2、 register寄存器型,这样定义加快程序运行速度。如果申请不到寄存器就使用一般内存,同auto,不能用&去获取寄存器变量地址,寄存器变量没有地址可言。
3、 static存储类型:静态存储类型变量,既可以在函数体内,也可以在函数体外说明。(默认是0)
特点1:在内存中以固定地址存放的,而不是以堆栈方式存放(也就是不会自动分配自动回收)
特点2:只要程序没结束,下次调用这个值的时候,该存储类型定义的值不会重复定义,而是保留上一次调用变量后存放的值。

借助下图了解上面的特点:
在这里插入图片描述
图中b是自动变量,每次进入for循环都会重新赋值,只要程序没结束,a不会重新赋值,所以a每次自加1不会被清掉,b自家以后会被重新赋值0

4、 extern存储类型:全局变量,在a.c下调用b.c下的一个变量,用extern声明一下即可,但是需要注意,static修饰的全局变量不能被其他文件调用

面试考点:static关键字作用?
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

五、运算符

5.1 算术运算符

在这里插入图片描述

5.2 关系运算符

在这里插入图片描述

5.3 逻辑运算符

在这里插入图片描述

5.4 位运算符

在这里插入图片描述
1、 按位~
unsigned char x = 0x17 , y = 0;
y = ~x;
则:x = 0001 0111 y = 1110 1000 = 0xe8 = 232
2、 按位&
unsigned char a = 0x55, b = 0x11, c = 0;
c = a & b;
则: a = 0101 0101 b = 0001 0001 c = 0001 0001 = 0x11 = 17
3、 按位|
unsigned char d = 0;
d = a | b;
则:d = 0101 0101 = 0x55 = 85
4、 按位^
unsigned char f = 0;
f = a ^ b;
则:f = 0100 0100 = 0x44 = 68
5、 右移位>>
unsigned char g = 0;
g = a >> 4;
则:g =0000 0101 = 0x05 = 5
6、 左移位<<
7、 unsigned char h = 0;
8、 h= a << 4;
h = 0101 0000 = 0x50 = 80
程序运行截图如下:
在这里插入图片描述

思考:
1、如何把一个无符号数的某位快速置1?
答:假设无符号数为a,要置1的位为第三位(此处认为第三位是bit3,而非bit2),使用如下表达式快速置1,a| = 1<<3;
2、如何把一个无符号数的某位快速清0?
答:假设无符号数为a,要置0的位为第五位(此处认为第五位是bit5,而非bit4),使用如下表达式快速置1,a&= ~(1<<5);
3、如何利用位运算把一个十进制数转化成一个十六进制数?
a = 65->0x41
b1 = 65/16 = 4 b2 = 65%16 = 1
b1 = a>>4; b2 = a & 0x0f

5.5 赋值运算符

在这里插入图片描述

5.6 特殊运算符

5.6.1 条件运算符

//<表达式1>  ?  <表达式2>  :  <表达式3>
unsigned a = 5,b = 4,c = 0;
a > b ? (c = 5) : (c = 0);   //则输出c = 5

5.6.2 逗号运算符

在这里插入图片描述
从上图看出,逗号运算符输出的结果是最后一个表达式的值,最后一个表达式之前的操作也会进行,但是不输出。(逗号运算符内表达式从左到右执行)

5.6. sizeof运算符

只针对数据类型,而不针对变量。

sizeof(类型或者变量名)

六、总结与思考
1、关键字static的作用是什么?
答:
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

2、已定义一个变量num ,其值为5,简单编程函数实现下列位操作:
1)第二位清零;
2)第二位置1;

答:

#include<stdio.h>
int main(int argc,char *argv[])
{
    int num = 5;
    num &= ~(1<<1);   //实现第二位清零
    num |= 1<<1;      //实现第二位置1
}

3、简述extern关键字的作用
答:
使用extern关键字声明的变量代表可以调用其他文件中定义的相同的全局变量,static定义的全局变量除外

4、有以下程序
unsigned int a = 0x20;
a = a >> 2;
a = ~a;
执行完该程序后变量a的值是多少?
答:
由于a是32位数据,执行后a=0xfffffff7

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值