【速过C primer plus】二、三章

【速过C primer plus】二、三章

一、变量命名规则

长度限制:(C99和C11)对于标识符名,编译器只能识别前63个字符;对于外部标识符,只允许使用31个字符。

​ 你可以使用大于63个的字符作为标识符名,但是编译器只能识别前63个,导致两个名字长度大于63个字符的不同变量**可能1**会被编译器识别为同一变量。

​ 1.为什么是可能而不是一定

​ 答:这种情况下会发生什么,标准并没有定义。C语言标准只定义规则内允许发生的事情,而对于标准未定义的事情,发生结果在不同电脑、运行环境、编译器下运行结果也是未知的。

规则限制:只能用小写字母、大写字母、数字和下划线来进行命名,并且第一个字符不能是数字,尽量也不使用下划线作为开头第一个字符2。C语言的变量名区分大小写。

​ 2.为什么不推荐下划线作为变量名开头

​ 答:操作系统和C库经常使用一个或者两个下划线字符开始的标识符,冒然使用下划线开头可能会占用到保留字,或者是直接调用到了保留变量。

二、保留字

​ 以下涵盖了从C90-C11所有标准中的所有保留字

auto		extern		short		while
break		float		signed		_Alignas
case		for			sizeof		_Alignof
char		goto		static		_Atomic
const		if			struct		_Bool
continue 	inline		switch		_Complex
do			long		union		_Imaginary
default		int			typedef		_Generic
double		register 	unsigned	_Noreturn
else		restrict	void		_Static_assert
enum		return		volatile	_Thread_local

请不要随便使用关键字与保留字作为你的变量、函数名。关键字会直接被识别出错误,保留字虽然不会引起语法错误,但请不要使用。

C语言的数据类型关键字列表

最初K&R给出的关键字C90标准添加的关键字C99标准添加的关键字
intsigned_Bool
longvoid_Complex
short_Imaginary
unsigned
char
float
double

三、C语言变量

位、字节、字

​ 位(bit):是最小存储单元,存储0与1

​ 字节(byte):是常用的计算机存储单位,定义是一个字节存在8位。

​ 字(word):是设计计算机给定的自然存储单位,字的大小不是统一的。字在8位计算机中字长只有8位,而在不同计算机中存在不同字长。

int类型

一些特殊说明:

  • ISO C定义int类型变量的最小值为-32768-32767(215

  • 其他整型类:short int、long int 、long long、unsigned int、unsigned long int。

  • signed修饰符实际上并不起什么作用,只是强调后续的整型有使用符号的意图,作为说明存在。

  • 使用占位符时,%d表示输出十进制、%o表示输出8进制、%x表示输出16进制,并且:0开头的数字会被默认为八进制数,0x或者0X开头的数会被默认为16进制数。(输入非法八进制数可能编辑器会报错,09会报出非法八进制数)

  • unsigned的修饰会使整型范围发生偏移,0被固定为最小值而MAX_INT+MIN_INT会变为最大值(可以认为最大值翻倍)。

​ 关于int类型的范围理解:

​ int类型的范围是一个环状结构,最大值和最小值首尾相连。最大值发生溢出时会将数字加到最小值那一方,最小值溢出时也一样,vs测试函数:

#include<stdio.h>

int main()
{
	int i = _CRT_INT_MAX;
	printf("%d,%d",i,i+1);
}
//结果输出:2147483647,-2147483648

char类型

  • 由于ASCII码的范围是0~127,所以char的初始大小定义就是8位即,0~127,在C语言系统中,char的大小定义为1字节,所以在任何系统中char都是可以使用/通用的。

  • 储存原理:实际上字符是以ascii码表上的数值来确定的,可以认为char就是一个范围大小只有0~127的短int类型,在单个char上既可以用单引号字符赋值,又可以用数字赋值(int也可以用字符赋值)。

  • C标准中,虽然没有定义字符的范围,即只要是单引号引起的一串或一个字符都可以作为单个字符存在,但是由于char只有8位,所以无论如何也只能存储一个字符,它会优先去存储给定串字符中的排最后的那单个字符

    #include<stdio.h>
    
    int main()
    {
    	char i = 'ABCD';
    	printf("%c",i);
    }
    //结果输出D
    

    转义符的特殊用法:

    \作为转义识别符,它除了会把定义好的特殊字符转义成目标字符以外,还可以转义数字。

    #include<stdio.h>
    
    int main()
    {
    	char i ='\377';
    	printf("%d", i);
    }
    
  • \加上数字后char会尝试把他们解释为八进制,如果你输入了非八进制数则解释会提前停止,比如’\329’,他会尝试解释该字符为为八进制的32和9连接。

  • 由于char是有大小限制的,放入的八进制数最多只能到达127,如果在该电脑上char的定义带有负数部分,比如-128~127,那么大于127的数字会被显示为负数。请注意:在这种情况下超范围最多溢出一次,第二次溢出时编译器会报错,比如测试案例中的’\377’计算结果是-1,再代入’\378’编译器会报错,显示char无法表示此数字

  • 在char中,signed是有用的,如果该编译器默认的char是unsigned类型,则可以通过signed将其修饰成带符号的char。

  • 同理,\之后加上x会被char尝试解释为16进制数,注意问题和八进制相同。

布尔类型

  • 虽然C语言有自己的布尔类型_Bool,由于C++中已经实现了bool类型,所以在.cpp文件中是无法使用_Bool类型的,同样在.c文件中无法使用bool变量,它们的性质几乎相同,大小为一位,能装入true或false,使用%d可以用来表示1或0.
  • 要在.C文件使用_Booltruefalse需要引入头文件stdbool.h
  • C语言中没有对布尔类型的转义说明符,所以布尔类型只能用%d输出来确认是0还是1来辨别真假,不能像C++/java一样直接输出true或false。
  • _Bool类型赋值时是可以溢出的,他会自动将溢出的数做一次判断,如果等于0则为假,否则为真。所以可以给布尔变量赋值整数/浮点来判断。

浮点类型

  • 浮点类型是可以用科学计数法的,书写方式是浮点数e整型数,C语言能够处理负数指数,但是无法处理小数指数。

  • 浮点数可以使用F后缀使数字默认为float类型,也可以用L或者l使数字成为long double类型,建议使用L,因为l和1差不多。

  • C99中加入了16进制浮点数,十六进制数指数表示时需要使用P或者p。

  • 浮点数存在上溢,如果数字过大,超过了浮点上限,则会附一个无穷大,使用printf()输出时会显示inf或者infinity。

  • 浮点数存在下溢,如果浮点部分太小,超过了浮点精度的下限,再执行其他计算时会清除掉向下溢出的部分。

  • 特殊浮点数NaN表示非数,用于出现了规定之外的计算结果,比如asin(2)

  • 给浮点数赋值整型将会默认为浮点,并且在数字后面加入小数点和零。如果给整型数赋值小数,则会把小数部分直接截断,不会四舍五入。

浮点的错误舍入:

#include<stdio.h>
int main()
{
	float i = 0.9999999;
	printf("%f",i);
}
//结果输出1.000000,发生精度溢出了

sizeof()

​ sizeof()函数计算结果的单位是byte(字节),其中char一定为1,其他类型在不同系统下的大小将会不同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值