【C语言】基础知识杂记(整理自用)

前言

之前一直在学新知识,最近打算复习一下之前学的,所以写了这篇文章,记录一下不熟练的知识点,自用,对大家帮助可能不是很大。

double类型与float类型

编译器默认7.0为double类型

在数据后加一个f,编译器就会认为7.0f为float类型

%的使用

取模

当%作为取模操作符来使用时,其左右两边必须是整数,不能是小数

打印%

当想打印出%时,使用%%,输出结果是%

#include<stdio.h>

int main()
{
	printf("%%");
	
	return 0;
}

输出结果:
在这里插入图片描述

!与~

逻辑反操作:真表示为假,假表示为真

#include<stdio.h>

int main()
{
	int a = 4;
	if (a == 4)
	{
		printf("1\n");
	}

	if (!(a == 4))
	{
		printf("1\n");
	}
	else
	{
		printf("0\n");
	}

	return 0;
}

运行结果:

在这里插入图片描述

~

将1取反为0、0取反为1

注意:

位操作符,操作的都是补码

提示:

-1的补码是32个1

sizeof和strlen

sizeof运算符

计算的元素在内存中占用的空间大小,单位是字节

最根本的区别是:sizeof是运算符,不是函数。并且sizeof可计算任意数据类型的大小
(当我尝试搜一下sizeof的源码看看它是怎么实现的时候,发现,它是运算符…)

‘\0’

注意,在计算数组的字节大小时,是包含’\0’的,因为\0也是里面的元素之一

strlen函数

计算数组中的元素个数,返回值类型是size_t,
strlen是函数,不是运算符。并且strlen函数只能计算数组的元素个数

‘\0’

strlen函数是计算‘\0’之前的元素个数,遇到‘\0’停止读取,并返回一个无符号整数,
此处涉及到strlen函数是如何实现的,此处附上它的源码

size_t __cdecl strlen (
        const char * str
        )
{
        const char *eos = str;

        while( *eos++ ) ;

        return( eos - str - 1 );
}

%g与%e

%g

在输出浮点型数据时,使用%g,编译器会选择是按照%f还是%e的方式来打印数据。哪种方式短就选择哪种,不输出无意义的0

%e

以指数的形式输出实数,
当对于输出无精度要求时,部分编译器自动认为小数部分有5位,指数部分有6位,
并且,小数点前只有1位(标准化指数形式)

示例:

下面用一段代码来区分%f、%e、%g

#include<stdio.h>

int main()
{
	float a = 123.321;
	printf("%f\n%e\n%g\n", a, a, a);

	return 0;
}

在这里插入图片描述

%G和%E

就是e在打印时是大写

static修饰的(局部、全局)变量和函数

static:静态的

用法一:static修饰局部变量

我们都知道:
局部变量在每次进入函数会重新创建,出了函数就会销毁(将空间还给操作系统)

并且局部变量存储在栈区,进入作用域自动创建,出作用域自动销毁

本质:

使变量的存储位置发生了变化

注意:

变量的作用域没变,无法出作用域使用 ,即无法在变量所处函数外面使用

static延长的是生命周期

修饰后:

局部变量出了作用域不会回收,局部变量的生命周期被延长,如果反复调用函数,会出现累积的效果,如:累加、累乘等

此时的局部变量已经存储在静态区,直到程序结束,该变量才会被回收

多说一句:
static所在代码在编译期间已分配地址,其代码行在运行时不再执行,即其地址不再变化(静态区)

用法二:static修饰全局变量

1:

全局变量无法在其他源文件中被引用

2:

使其只能在其所在的源文件内部使用
(即使其外部链接属性变为内部链接属性)

用法三:static修饰函数

注意:函数不存在生命周期这种说法

修饰前:

函数具有外部链接属性,即可以在其他源文件内被调用(使用extern声明)

修饰后:

外部链接属性变为内部链接属性

函数只能在其所在的源文件内部使用,其他源文件无法使用

好处:

这样就能设多个名字相同的函数,并且也不会发生冲突
(应该很少有人其名字一样的函数吧)

输出控制符

此处就整理了一些我不太会的,比较常见的我就没整理

%p

输出指针地址

十进制输出

%hd

以有符号整型的形式输出short类型整数

%u

以无符号整型的形式输出unsigned int类型的整数

八进制输出

%o

无前缀,以无符号的方式输出int类型的整数

%#o

以有前缀、无符号的形式输出int类型的整数

十六进制

%x

以小写、无前缀、无符号的形式输出int类型的整数

%#x

有前缀的形式输出整数

%X

以大写的形式输出整数

移位操作符

左移操作符和右移操作符

左移操作符

左边丢弃、右边补0
有*2的效果

提示:即使是负数,其运算之后不改变符号

右移操作符

分为两种右移方式:算术右移和逻辑右移

逻辑右移:

右边直接丢弃,左边补0

算术右移:

右边直接丢弃,左边补符号位
原来是负数,左边补1
原来是正数,左边补0
有/2的效果

大部分编译器采用的都是算数右移

结语

先复习到这里,之后会接着复习指针及后面的知识

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值