02 2023 档案
摘要:为什么声明符的方法如此古怪 问:为什么声明符的语法如此古怪? 答:声明试图进行模拟使用。指针声明符的格式为*p,这种格式和稍后将用于p的间接寻址运算符方式相匹配。数组声明符的格式为a[...],这种格式和数组稍后的取下标方式相匹配。函数声明符的格式为f(...),这种格式和函数调用的语法相匹配。这种
阅读全文
摘要:不能把const对象用在常量表达式中 问:为什么不能把const对象用在常量表达式中呢?“constant”不就是常量吗? 答:在C语言中,const表示“只读”而不是“常量”。下面用几个例子说明为什么const对象不能用于常量表达式。 首先,const对象只在它的生命期内为常量,而不是在程序的整个
阅读全文
摘要:作用域和链接之间的区别 问:“作用域”和“链接”之间的区别到底是什么? 答:作用域是为编译器服务的,而链接则是为链接器服务的。编译器用标识符的作用域来确定在文件的给定位置访问标识符是否合法。当编译器把源文件翻译成目标代码时,它会注意到有外部链接的名字,并最终把这些名字存储到目标文件内的一个表中。因此
阅读全文
摘要:变长数组什么时候分配空间 问:具有自动存储期限的变量在所在块开始时分配内存空间。这对于C99的变长数组是否也成立? 答:不成立。变长数组的空间不会在所在块开始执行时就分配,因为那时候还不知道数组的长度。事实上,在块的执行到达变长数组声明时才会为其分配空间。从这一方面说,变长数组不同于其他所有的自动变
阅读全文
摘要:把选择语句和重复语句视为块 问:在C99中,为什么把选择语句和重复语句(以及它们的“内部”语句)视为块? 答:这条奇怪的规则来源于把复合字面量用于选择语句和重复语句时出现的一个问题。该问题与复合字面量的存储期限有关,所以我们先花点时间讨论一下这个问题。 C99标准指出,如果复合字面量出现在函数体之外
阅读全文
摘要:在机器层面,调用函数之前可能需要预先执行一些指令。调用本身需要跳转到函数的第一条指令,函数本身可能也需要执行一些格外的指令来启动执行。如果函数有参数,参数需要被复制(因为C通过值传递参数)。从函数返回也需要被调用的函数和调用函数执行差不多工作量。调用函数和从函数返回所需的工作量称为“额外开销”,因为
阅读全文
摘要:下面这个声明符是什么意思呢? int *(*x[10]) (void); 这个声明符组合了*,[]和(),所以x是指针、数组还是函数并不明显。 幸运的是,无论多么费解,有下面两条简单的规则可以用来理解任何声明。 ♠ 始终从内往外读声明符。换句话说,定位声明的标识符,并且从此处开始解释声明。♠ 在作选
阅读全文
摘要:下面的代码段说明了变量和形式参数声明中怨念或者省略存储类型的所有可能的方法。 int a; extern int b; static int c; void f(int d, register int e) { auto int g; int h; static int i; extern int
阅读全文