Tag: kr c

UINT_MAX与C中的ULONG_MAX相同

在解决K&R C书中的练习时,我偶然发现了练习2.1。 起初我把UINT_MAX作为-1 ,但后来我使用了%u占位符,但现在它给了我与ULONG_MAX相同的数字。 在附录B的书中,他们说UINT_MAX应该是65535而ULONG_MAX应该是4294967295 ,但是在运行练习时,它给我的UINT_MAX和ULONG_MAX都是4294967295 。 这是为什么?

ungetc(或从K&R取消工作)的目的是什么?

任何人都可以向我解释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; } […]

关于C的K&R书中的示例1.5.2的问题

我正在用K&R教自己C,并且被本书中的一个例子所困扰。 我完全按照示例中编写的方式编译代码,但它不会像作者所说的那样做。 该程序应该计算字符数。 给出的代码如下: #include /* count characters in input; 1st version */ main() { long nc; nc=0; while (getchar() != EOF) ++nc; printf(“%ld\n”, nc); } 为了编译它我用int main()替换main()。 但我认为这与问题无关。 该程序编译并运行正常。 但它根本不计算字符,因为它是写的。 我错过了什么吗? 自从本书出版以来,现代编译器如何处理代码示例这样的事情会有所改变吗? 任何有关此留言板上的好人可能提供的帮助将不胜感激。 最好,丹

正确声明ANSI C中的main()函数

C标准说: 程序启动时调用的函数名为main。 该实现声明此函数没有原型。 它应该使用返回类型int并且没有参数来定义: int main(void) { /* … */ } 或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称): int main(int argc, char *argv[]) { /* … */ } 或等效或以某种其他实现定义的方式。 但是,Kernighan&Ritchie在他们的第二版(规范的ANSI C)圣经中使用: main() { /* taram pampam … */ return 0; } 谁是对的? 它是否与函数没有返回值自动假设在C中返回int ?

(K&R)至少内部名称的前31个字符是重要的?

从字面上看,它是有道理的,但它究竟是什么意思成为变量名的重要字符? 我是使用K&R开始学习C语言的人。 这是本书的直接引用: “至少内部名称的前31个字符是重要的。对于函数名称和外部变量,数字可能小于31,因为外部名称可能被汇编程序和加载程序使用,语言无法控制。对于外部名称,该标准仅保证6个字符和一个案例。“ 顺便说一下,“单一案例”是什么意思?

这条线的目的是什么? (function声明)

我正在通过K&R学习编程。 到目前为止还不错,但我不清楚第1.8节(函数)中的一行代码的作用。 在1.8节中,作者向您展示了如何创建一个函数来将一个整数提升到另一个整数的幂。 我已经粘贴了下面的代码,正如书中所写的那样。 一切都很好。 但我不知道为什么他们把这条线包括在最上面: int power(int m, int n); 这本书没有提到它,除了说该程序将整数m提高到幂n。 如果我从代码中删除该行,程序仍然按预期输出。 如果我理解这一点,就行了 int power(int base, int n) 创建函数,下面的大括号定义函数。 然后main下的大括号调用函数输出图表。 所以这一切似乎都有道理。 但我不明白最重要的是什么。 这可能是无关紧要的,但我似乎更有可能错过了一些东西。 任何人都可以告诉我为什么那条线在那里? #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i = 0 */ int power(int base, int n) { int […]

至少内部名称的前31或63个字符是重要的?

以下是本书的直接引用(K&R,第2版,第35页): “至少内部名称的前31个字符是重要的。对于函数名称和外部变量,数字可能小于31,因为外部名称可能被汇编程序和加载程序使用,语言无法控制。对于外部名称,该标准仅保证6个字符和一个案例。“ 在C99中,其内部名称没有长度限制,但只有前63个保证是重要的(§5.2.4.1翻译限制)。 我的问题是为什么这些限制特别是31或63 ? 为什么这个号码具体? 为什么不是19,24或任何其他数字? 如果这是一个实施问题,是否可以从31或63获益?

K&R Qsort示例与指针和arrays混淆

我发现很难理解下面的代码片段。 我理解指向function矫揉造成的指针,但我发现混淆在指示的行中。 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] […]

如何自动将K&R函数声明转换为ANSI函数声明?

// K&R syntax int foo(a, p) int a; char *p; { return 0; } // ANSI syntax int foo(int a, char *p) { return 0; } 如您所见,在K&R样式中,变量的类型在新行中而不是在大括号中声明。 如何自动将K&R函数声明转换为ANSI函数声明? 在Linux中有人知道这么容易使用的工具吗?