《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 whilebreak float signed _Alignascase for sizeof _Alignofchar goto static _Atomicconst if struct _Boolcontinue inline switch _Complexdo long union _Imaginarydefault int typedef _Genericdouble register unsigned _Noreturnelse restrict void _Static_assertenum return volatile _Thread_local请不要随便使用关键字与保留字作为你的变量、函数名。关键字会直接被识别出错误,保留字虽然不会引起语法错误,但请不要使用。
C语言的数据类型关键字列表
| 最初K&R给出的关键字 | C90标准添加的关键字 | C99标准添加的关键字 |
|---|---|---|
| int | signed | _Bool |
| long | void | _Complex |
| short | _Imaginary | |
| unsigned | ||
| char | ||
| float | ||
| double |
三、C语言变量
位、字节、字
位(bit):是最小存储单元,存储0与1
字节(byte):是常用的计算机存储单位,定义是一个字节存在8位。
字(word):是设计计算机给定的自然存储单位,字的大小不是统一的。字在8位计算机中字长只有8位,而在不同计算机中存在不同字长。
int类型
一些特殊说明:
-
ISO C定义int类型变量的最小值为-32768-32767(2^15^)
-
其他整型类: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,-2147483648char类型
-
由于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文件使用_Bool和true与false需要引入头文件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,其他类型在不同系统下的大小将会不同。
部分内容可能已过时