c语言类型以及语句

本文介绍了C语言中未初始化的局部变量在for循环中的不确定性,变量的声明与初始化,全局变量(普通与静态)的作用范围与生命周期,字符类型的特性和与0的区别。还讨论了有符号数与无符号数、进制表示、原码、反码和补码的概念,以及逗号运算符的使用。同时提到了内存访问的关键字如const、register和volatile,以及sizeof运算符和转义序列的应用。
摘要由CSDN通过智能技术生成

1、以下代码循环几次?(面试题)

void test(){
    int i;          // 局部变量 i 的值是不确定的
    for(;i<10;i++){
      ;
    }
}

答案是---------不确定,在 c 语言中局部变量 i 没有初始化,值是不确定的,所以 i 的值可能是 0 ,也可能是其他任意数值,所以 for 循环的次数是不确定的!

2、定义变量的时候给变量赋值叫做初始化

int num = 10 ;      //是初始化
int data ;          //没有定义变量的时候给变量赋值,所以没有给变量初始化
data = 10 ;         //不是初始化

一般变量都是初始化为 0 ,因为变量的值都是可以修改的,这样可以保证空间中是干净的!!!!!!

int num = 0 ;

3、变量的声明:先使用 后定义 必须事先对变量进行声明

在这里插入图片描述

-----、普通全局变量

作用范围:
   全局变量的作用范围,是程序的所有的地方;
   只不过使用之前需要声明,声明方法是 extern int num;(如果是本文件访问变量的话就不需要extern,但是其他文件访问该全局变量的话就要使用extern声明!
   注意声明的时候,不要赋值
生命周期:
   程序运行的整个过程,一直存在,直到程序结束!
注意:
   定义普通的全局变量的时候,如果不赋初值,它的默认值是 0

在这里插入图片描述

-----、静态全局变量

作用范围:
   static限定了静态全局变量的作用范围,只能再它定义的源文件.c中有效存在
生命周期:
   程序运行的整个过程,一直存在,直到程序结束!
注意:
   定义普通的全局变量的时候,如果不赋初值,它的默认值是 0

在这里插入图片描述

4、字符类型 char

单引号只能作用于一个字符,转义字符除外!!!!!!!!!!!!!!!!

单引号的作用:
   第一个作用:‘a’描述a为字符
   第二个作用:取字符的ASCII值
printf %c 输出的是字符
printf %d 输出的是字符的ASCII值
//一般对字符变量初始化为下列结果,表明把字节全部清空
char ch = '\0';       //'\0'在计算中存储的本质是ASCII值 0              
//便于修改,而不是下面的方式(当然也可以,但是上面的方式比较准确,便于修改内存空间的值)
char ch;
char ch = 'a';

在这里插入图片描述
在这里插入图片描述

'\0'没有对应的字符,只有ASCII值,所以上面的字符打印是空!

-----、谈谈’0’和’\0’的区别?(面试问题)

‘0’是字符串 0,计算机中存储的ASCII值是 48

‘\0'没有对应的字符串,而且在计算机中的存储的ASCII值是 0

-----、使用getchar去掉回车符号

在这里插入图片描述
在这里插入图片描述

-----、解决方法,在scanf后面加入getchar去掉回车符号

在这里插入图片描述
在这里插入图片描述

5、有符号数和无符号数

-----、有符号数

数据二进制位的最高位是符号位,其他位是数据位
最高位为 1 ,表示的是 负 数
最高位为 0,表示的是 正数
以一字节为例:xddd dddd
1111 1111 ~ 1000 0000 ~ 0000 0000 ~ 0111 1111
-127 -0 ~ +0 ~127
将-0看成-128,所以是 -128 ~ 127,表示 256 个数

-----、无符号数

没有符号位,所有的二进制位都是数据位
0000 0000 ~ 1111 1111
0 ~ 255,表示 256 个数

-----、定义有符号数的方式

int num ; //方式一,默认方式(推荐),num是有符号数
signed int num; //方式二,使用关键字 signed 显示说明这是无符号数的定义

-----、输出有符号数的方式

%d  int        //输出有符号数int
%hd short      //输出有符号数short
%ld long       //输出有符号数lonng    

-----、定义无符号数的方式

unsigned int num;  //定义无符号数

-----、输出无符号数的方式

%u unsigned int          //输出有符号数unsigned int
%hu unsigned  short      //输出有符号数unsigned short
%lu unsigned long        //输出有符号数unsigned long    

6、进制输出(八进制没有正负之分)

在这里插入图片描述
在这里插入图片描述

7、原码、反码、补码

计算机中存储的是数据的补码
原码:数据的二进制形式
123:原码 0111 1011

无符号数:
   补码==反码==原码
        123原码:0111 1011
        123反码:0111 1011
        123补码:0111 1011
有符号数:
   正数:(0是符号位)
        补码==反码==原码
        +123原码:0111 1011
        +123反码:0111 1011
        +123补码:0111 1011
   负数:(1是符号位)
         反码 == 原码 的符号位不变,其余的按位取反
         补码 == 反码 + 1 (符号位要是溢出不管,按照溢出取结果)
         -123原码:1111 1011
         -123反码:1000 0100
         -123补码:1000 0101

-----、补码的意义(面试问题)

(1)、统一了0的编码

+0 的补码:0000 0000
-0 的补码:1000 0000(原码)-----1111 1111(反码)-----0000 0000(补码)

(2)、将减法变为加法运算,若是没有补码,直接计算10-6是-16,这是错误的,但是若是取-6的补码,则直接计算就是正确的!
在这里插入图片描述

8、计算机对数据的存储

负数在计算机中以补码的方式存储
非负数在计算机中以原码的方式存储
八进制在计算机中以原码的方式存储
十六进制在计算机中以原码的方式存储
综上所述:除过二进制负数是在计算机中以补码的形式存储,其余的不论是无符号还是有符号的正数,或者是八进制还是十六进制或者是二进制的正数
使用十六进制查看内存数据存储情况

9、其他关键字

-----、const 修饰变量为只读

const int num = 10; //const修饰的变量num,为只读变量,本质是变量
num = 20;   //只读变量只能初始化不能赋值,erro

-----、register 修饰寄存器变量

在这里插入图片描述

如果变量高频繁使用,会自动将变量存储在寄存器中,是为了提高访问效率
如果用户想直接将变量放在寄存器中可以直接使用 register 修饰

register int num = 10;

在这里插入图片描述

在这里插入图片描述

-----、volatile

-----、(1)强制内存访问

volatile int num = 10;    //对num的访问,必须直接从内存访问

-----、(2)防止编译器优化

volatile int num = 0;
num = 10;
num = 11;
num = 12;
num = 13;
printf("%d",num);     

在这里插入图片描述

-----、sizeof(面试题)

在这里插入图片描述
在这里插入图片描述

10、八进制转义(面试题)

'\ddd'每个 d 的范围都是 0~7,3 个 d 表示最多识别 3 位 八进制数

以下正确的选项是__A__
A、'\123'       //一个字符(ASCII值按照需要算,八进制转义的ASCII值为1*8^2+2*8^1+3*8^0,十六进制转义的ASCII值也是如此)
B、'\18'        //两个字符'\1'和'8'(超出范围)
C、'\1234'      //两个字符'\123'和'4' (多了一位)        
D、'\183'       //三个字符'\1'、'8'(超出范围)、'3'

11、十六进制转义(面试题)

'\xhh' 每个 h 的范围是 0~9,a ~ f,2 个 h 表示最多识别 2 位十六进制(其中‘\x’代表的是十六进制)

以下正确的选项是__B D__
A、'\af'        //两个字符'\a'和'f'     
B、'\123'       //一个字符,八进制转义
C、'\x3df'      //溢出,多了一位      
D、'\xab'       //一个字符,十六进制转义

12、类型转换

-----、自动类型转换(保证精度不丢失,将小的类型转换为大的类型)

在这里插入图片描述

-----、(1)无符号和有符号参加运算,需要将有符号转换为无符号,结果为无符号数,若是使用有符号提取结果,则结果为有符号数

在这里插入图片描述
在这里插入图片描述

-----、(2)int 和 double 参加运算,会将 int 转换为double,输出结果也是 double 类型

在这里插入图片描述

在这里插入图片描述

-----、(3)char 和 short 参加运算,会将 char 和 short 都转换为 int,所以结果是 int

在这里插入图片描述
在这里插入图片描述

-----、强制类型转换

在这里插入图片描述

13、产生随机数

-----、如果rand()函数产生一个随机数 > 0,请使用rand()产生 60 ~ 100的随机数

rand()%41+60 ;

-----、如果rand()函数产生一个随机数 > 0,请使用rand()产生 ‘a’ ~ 'z’的随机字母

rand()%26+'z' ;

在这里插入图片描述
在这里插入图片描述

14、位运算(二进制运算)

-----、& 按位与

语法:全 11,有 00
特点: 和1相与保持不变,和0相与为0
场景:将指定位清 0
案例1:
	 data为1字节,将data 的 34位清零,其余不变
	 unsigned char data;
	 data = data & 1110 0111
	 data = data & 0xe7;
	 data & = 0xe7;

-----、| 按位或

语法:有 11,全 00
特点: 和1或置1,和0或保持不变
场景:将指定位置 1
案例1:
	data为1字节,将data 的 56位置1,其余不变
	unsigned char data;
	data = data & 0110 0000
	ata = data & 0x60;
	data | = 0x60;

-----、~ 按位取反

语法:0110

-----、^ 按位异或

语法:相同为 0,不同为 1
特点: 和1异或取反,和0异或保持不变
场景:将指定位发生翻转

-----、左移 <<(乘法,左边丢弃右边补0)

移动的大小不要超过自身的长度,否则不如直接赋值为 0
在这里插入图片描述
在这里插入图片描述

-----、右移 >>(除法,右边丢弃,左边补0)

在这里插入图片描述

算术右移、逻辑右移都是由编译器来决定的,用户不能自己来决定是逻辑右移还是算术右移
无符号数:右边丢弃,左边补0
有符号数: 
       正数:右边丢弃,左边补0
       负数:
           右边丢弃,左边补0(逻辑右移)
           右边丢弃,左边补1(算术右移)

假设data是无符号数
在这里插入图片描述

-----、测试是逻辑右移还是算术移动算法(面试问题)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

所以在linux下的gcc是属于算术右移!!!!!!!!!!!!!!!

-----、(操作单片机)位运算的高级应用 (重点:前面按位与和按位或的案例)

在这里插入图片描述

15、逗号运算符

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值