个人原创整理的C语言各方面的琐碎知识点。如果这些基础你都不知道,你还好意思说自己精通C吗?
1 printf是C语言的一部分?
错误!printf是标准输入输出库的部分
2 printf中 %3.0f和%.0f的作用
%3.0f表示至少3个字符的宽度,不显示小数点和小数部分
%.0f表示无小数和小数点部分
3 符号常量是什么?有什么作用?
‘A’就是符号常量
4 外部变量注意点
1.函数要使用外部变量可以用extern
显示声明,如:
int max;
int main()
{
extern int max;
return 0;
}
2.如果外部变量在函数之前,函数使用该外部变量可以不使用extern
3.外部变量在file1定义,在file2,file3使用需要extern
显示声明。用于建立之间的联系。
5 数据类型
short
实际上是short int
,一般简写为short
long(int)
signed
和unsigned
可以用于char和任何整型
long double
是高精度浮点数
6 常量
1234
是int常量(数值太大int无法表示的则为long常量)
123456789L
,包含了L
orl
的是 long常量
u or U
的后缀是 无符号常量
小数形式如3.12
或者1e-2
形式的,是浮点常量:后缀f or F
为float常量;什么都没有则为double常量;有l or L
则是long double
常量
整数常量
\013
是八进制,代表制表符
\xb
十六进制,也表示制表符
7 字符串常量
又称为字符字面值
“hello”或者“”(空字符串)都是字符串常量
字符串常量中可以使用转义字符
“hello” “world”可以用于链接字符串
8 转义字符
\a 响铃
\n 换行
\f 换页(例如回车25行)
\b 回退
\r 回车
\t 横向制表符:跳到下一个制表符的位置(一个tab8位)
\v 纵向制表符:跳转到下一行,\v前一个字符的下一列
\030 八进制
\xb 十六进制
9 什么是枚举?enum的注意点和优点
enum color{ green = 0, red, black};
注意点:
1. 名字必须不同
2. 不同名可以同值
优点:
1. 值可以自动生成
2. 编译器会检查enum变量的值是否是其有效值
3. 可以以符号形式打印enum变量的值
10 声明
- 外部变量、静态变量默认初始化为0
- 未初始化自动变量为垃圾值
- 任何变量都可以使用
const
11 什么是闰年?
能整除400 或者 能整除4却不能整除100 的年份是闰年
((n % 400) == 0) || ( (n % 4) == 0 && (n % 100) == 0)
12 类型转换注意点
- 自动转换:从窄的数据类型转换为宽的数据类型,没有精度损失
- char是较少的整型,可以自由使用。C语言没有规定char是否是signed。
- 表达式中float不会自动转换为double
- 有符号:二元运算符如(* +)两个操作数如果具有不同类型,低的会自动转换为高的
- float转换为int,会舍去小数部分
- double转换为float,根据具体实现,可能会四舍五入
- 有符号数取决于机器,例如:int 16bit, long 32bit
-1L < 1U—-1U unsigned int回转换为sigend long int
-1L > 1UL—-1L signed long int会转换为 unsigned long - sqrt参数使用
double
(定义在math.h中)
例如:sqrt((double)n); 不然数值可能不对
补充
- 为了确保可移植性:如果char中保存的不是char的数据,需要显式地指明是
signed
还是unsigned
- 即使调用函数的参数为
char
、float
,也把函数的声明写成int
或者double
13 ++、–只能用于变量,不能用于表达式
14 编写从字符串s中删除字符c的程序
void squeeze(char *s, char c)
{
int i, j;
for(i = j = 0; s[i] != '\0'; i++)
{
if(s[i] != c)
{
s[j++] = s[i];
}
}
s[j] = '\0';
}
15 编写strcat(将第二个字符串复制到第一个字符串尾部)
void strcat(char *s, char *t)
{
int i, j;
i = j = 0;
while(s[i] != '\0')
i++;
while((s[i++] = t[j++]) != '\0')
;
}
16 位运算符只能用于整型
17 什么是算术移位,逻辑移位
算术移位右移补符号位
算术移位左移,逻辑移位左右移均补0
18 赋值运算符(*=等)
使用方式
x *= y + 1
等效于x = x * (y + 1)
优点:
- 不用检查两个的长表达式是否一样
- 有助于编译器产生高效代码
x *= y + 1
的类型是什么,值是什么
类型是左侧操作数的类型
值是赋值完成后的数值
18 条件表达式,三元运算符?: 优点
紧凑
19 运算符优先级
第二类:+ -表示数值的正负
20 求值顺序:C语言没有规定函数各个参数的求值顺序
所有的对函数参数的副作用都必须在调用函数之前完成
21 程序块
- 任何程序块中都可以声明变量
- 代码块内声明的变量可以隐藏程序块之外与之同名的变量,它们之间没有任何关系。如代码:
if(n > 0)
{
int i;//这里的i与if外面的i没有任何关系
}
- 然而,应该避免出现隐藏外部作用域中相同名字的情况,否则容易引起混乱,不是好的代码风格。
22 switch退出方式
break, return
23 shell排序
24 逗号运算符
逗号运算符是从左到右的顺序计算的。
但是如:for(int i = 0, j = 10; i < j; i++)
中的逗号, 不是逗号运算符,是平等关系
25 goto label中标号的作用域是整个函数
26 程序是什么的集合
函数定义和变量定义