K&R阅读注意点
一、
1、解决幻数问题
ANS:
幻数:一些值直接写入函数中,不利于系统化修改。(常量表达式)
例子
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
方法:给它们设定有意义的名字。#define 语句将一个符号名字或是符号常量定义为一串特定的字符:
#define 名字 替换文本
转变
#define LOWER 0 /* 温度表的下限 */
#define UPPER 300 /* 温度表的上限 */
#define STEP 20 /* 步长 */
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
2、指针&数组
- 指针:
B(被调用函数)内部需要修改A(调用函数)中变量的值,A(调用函数)必须提供这个变量的地址address给B(被调用函数),B(被调用函数)必须将对应参数声明为一个指针,并通过该参数间接访问这个变量。 - 数组:
当数组名作为参数时,传递给函数的值是这个数组的起始位置(或称起始地址),数组的元素并不进行拷贝。通过下标的方式,函数可以访问并修改数组内的任意元素。
char line[MAXLINE];
char longest[MAXLINE];
copy(longest, line);
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
3、外部变量
外部变量必须在所有函数之外**定义
**,且只能定义一次;该定义为变量预留出存储空间。
每个希望访问该变量的函数中还必须声明
它;该声明说明了变量的类型。
extern 语句
说明:
如果程序分为多个源文件,而且变量在文件 1 中定义,并在文件 2 和文件 3 中使用,那么在文件 2 和文件 3 中就需要用 extern 声明
来关联出现的变量。
做法是将变量和函数的extern 声明
放在一个单独的文件中(其历史称谓为头文件).h。
4、注意点:
定义:
int max;
#define LOWER 0
int power(int base, int n)
{
...
}
声明:
extern int max;
int power(int, int);
返回值类型 函数名称(可能存在的形参声明)
{
声明部分
语句序列
}
二、类型、运算符以及表达式
1、常量:
2、声明
所有变量在使用之前都必须声明,
- 一个声明指定了一个类型,并包含了由一个或多个此类型的变量组成的列表
- 可在其声明中进行初始化
char esc = ‘\\’;
int i = 0;
int limit = MAXLINE+1;
float eps = 1.0e-5;
限定符 **const** 可被应用于任何变量的声明中, 指明该变量的值不会被改变。
const double e = 2.71828182845905;
const char msg[] = “warning: ”;
/*表明此函数不会修改这个数组*/
int strlen(const char[]);
3、类型转换
4、递增与递减运算符
++n
在 n 的值被使用之前
将 n 递增,而 n++
则在 n 的值使用之后
再将其递增.
5、按位运算符
注意:按位运算符与逻辑运算符
x=1; y=2; x&y为0; x&&y为1
x << 2 (相当于 x 乘以了 4)
6、赋值运算符 op =
expr 1 op = expr 2
相当于
expr 1 = (expr 1 ) op (expr 2 )
7、条件表达式
expr 1 ? expr 2 : expr 3
for (i = 0; i < n; i++)
printf(“%6d%c”, a[i], (i%10==9 || i==n-1) ? ‘\n’ : ‘ ’);
8、算符优先级与求值次序
注意点:
函数调用、嵌套的赋值语句以及递增和递减运算符会引起“副作用”——对表达式的求值会附带造成某些变量的改变。
在任何带有副作用的表达式中,对组成表达式的变量的求值次序存
在着微妙的依赖关系。
如:
a[i] = i++;
——————————————————————————————————————————
参考文献:C程序设计语言(K&R)
转载:https://blog.csdn.net/qq_41070511/article/details/104799242
查看评论