ANSI C标准化过程的目标之一是生成K&R C(第一个发布的标准)的超集,其中包含随后引入的许多非官方特征.但是,标准委员会还包括一些新功能,例如函数原型(借用C++编程语言)和更强大的预处理器.参数声明的语法也已更改,以反映C++样式.
这让我觉得有差异.但是,我没有看到K&R C和ANSI C之间的比较.是否有这样的文件?如果没有,主要区别是什么?
编辑:我相信K&R书的封面上写着"ANSI C".至少我相信我在家里的版本确实如此.那么也许没有什么区别了?
我正在通过K&R阅读并找到关于寄存器变量的小部分,并想知道这里的人是否有一些很好的例子付诸实践.
来自K&R的4.7节:
寄存器声明看起来像
寄存器int x;
注册char c;
要清楚,我只是希望看到一些很酷的代码示例.我(我很确定我)理解主题,所以不要觉得需要输入详细的解释(除非你想).
从字面上看,它是有道理的,但它究竟是什么意思成为变量名称的重要字符?
我是使用K&R开始学习C语言的人.这是本书的直接引用:
"至少内部名称的前31个字符是重要的.对于函数名称和外部变量,数字可能小于31,因为外部名称可能被汇编程序和加载程序使用,语言无法控制.对于外部名称,该标准仅保证6个字符和一个案例."
顺便说一句,"单一案例"是什么意思?
我是一名读K&R的初级程序员,我觉得这本书假定了很多以前的知识.令我困惑的一个方面是内存中变量的实际表示,或者我应该说存在.数据类型到底为变量指定了什么?我不太确定如何说出这个问题......但我会问几个问题,也许有人可以为我提出一个连贯的答案.
当使用getchar()时,我被告知使用类型"int"比键入"char"更好,因为"int"可以容纳更多值而"char"只能容纳256个值.由于我们可能需要变量来保存EOF值,因此我们需要超过256个,否则EOF值将与256个字符中的一个重叠.在我看来,我认为这是一堆空洞的盒子.有人能给我一个更好的代表吗?这些"盒子"有索引号吗?当EOF与256个可用值中的值重叠时,我们可以预测它将与哪个值重叠吗?
另外,这是否意味着数据类型"char"只能在我们简单地手动为变量赋值时使用,例如char c ='a',当我们肯定知道我们只有256个可能的ASCII时字符?
另外,"char"和"int"之间的实际重要区别是什么?如果我们可以使用"int"类型而不是"char"类型,为什么我们决定在某些时候使用一个而不是另一个?是保存"记忆"(我使用引号,因为我实际上并不是"记忆"究竟如何工作).
最后,char类型的256个可用值究竟是如何获得的?我读了一些关于modulo 2 ^ n的内容,其中n = 8,但为什么这样做(与二进制有关?).什么是"modulo 2 ^ n"的模数部分(如果它与模运算有任何相关性,我看不到关系......)?
任何人都可以向我解释ungetch的目的吗?这是来自K&R第4章,您可以在其中创建反向波兰计算器.
我没有调用ungetch就运行了程序,在我的测试中它仍然可以正常工作.
int getch(void) /* get a (possibly pushed back) character */
{
if (bufp > 0)
{
return buf[--bufp];
}
else
{
return getchar();
}
}
void ungetch(int c) /* push character back on input */
{
if (bufp >= BUFSIZE)
{
printf("ungetch: too many characters\n");
}
else
{
buf[bufp++] = c;
}
}
Run Code Online (Sandbox Code Playgroud)
(我已经删除了getch中的三元运算符以使其更清晰.)
我从k&r学习C作为第一语言,我只是想问,如果你认为这个练习是以正确的方式解决的,我知道它可能不像你想的那样完整,但是我想要的意见,所以我知道我正在学习C.
谢谢
/* Exercise 1-22. Write a program to "fold" long input lines into two or
* more shorter lines, after the last non-blank character that occurs
* before then n-th column of input. Make sure your program does something
* intelligent with very long lines, and if there are no blanks or tabs
* before the specified column.
*
* ~svr
*
* [NOTE: Unfinished, but functional in a generic capacity]
* Todo:
* Handling of spaceless lines
* …Run Code Online (Sandbox Code Playgroud) 这是一个问题,C(K&R C)是怎样的?问题是关于C生命的前十年或二十年?
我知道,好吧,我从我的大学教授那里听到它们,C没有我们今天用ANSI C获得的标准库.他们曾经在包裹的程序集中编写IO例程!第二件事是K&R的书,是程序员阅读的最好的书之一,这就是我的教授告诉我们的:)
我想更多地了解一下好的C'.例如,与ANSI C相比,您对它有多大的了解,或者C如何改变程序员对编程的关注?
只是为了记录,我在主要阅读这两篇论文后问这个问题:
我知道它们是关于C++的!这就是为什么我想了解更多关于C的原因,因为这两篇论文是关于C++是如何从C诞生的.我现在在询问它之前的样子.感谢Lazarus指出第一版K&R,但我仍然渴望从SO大师那里了解更多关于C的信息;)
C标准说:
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用int的返回类型定义,并且没有参数:
Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):
Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或等效的或以某种其他实现定义的方式.
但是,Kernighan&Ritchie在他们的第二版(规范的ANSI C)圣经中使用:
main()
{
/* taram pampam ... */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁是对的?它是否与函数没有返回值自动假设int在C中返回?
我发现很难理解以下代码片段.我理解指向功能矫揉造成的指针,但我发现混淆在指示的行中.
void qsort(void **v, int left, int right, int (*comp) (void *, void *))
{
int i, last;
void swap(int **v, int i, int j);
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2); /* move partition elem */ [1]
last = left; /* to v[0] */ [2]
for (i = left + 1; i <= right; i++) /* partition */ [3]
if ((*comp) (v[i], v[left]) …Run Code Online (Sandbox Code Playgroud)