我刚开始学习C,我遇到了对 * 标准标识符 * 的引用,比如printf和scanf。这些函数和本书后面描述的预定义函数(如sqrt)之间的 * 区别是什么?我只是想概念化(原文如此-我是一个英国人哈哈)为我的发展知识。printf()是一个函数调用吗?它接受一个论点,不是吗?区别是基于它们是否可以改变,如果我选择,或者它们来自哪里?谢谢,(The我指的是《C语言中的问题解决和程序设计》(Problem Solving and Program Design in C)
printf
scanf
sqrt
printf()
mrwjdhj31#
这些术语(“* 标准标识符 "、“ 预定义函数 *”)都没有出现在ISO C11 standard中。C11 6.4.1描述了 * 关键字 *,例如long、for和return。C11 6.4.2将 * 标识符 * 描述为一个标识符是一个非数字字符(包括下划线_、小写和小写拉丁字母以及其他字符)和数字的序列,它表示6.2.1中描述的一个或多个实体。小写字母和小写字母是不同的。对标识符的最大长度没有具体限制。当在翻译阶段7期间将预处理标记转换为标记时,如果预处理标记可以转换为关键字或标识符,则将其转换为关键字。C11 7.1.2描述了 * 标准头文件 * 和 * 库函数 *。C11 7.1.3将 * 保留标识符 * 描述为每个头部声明或定义在其相关联的子子句中列出的所有标识符,并且可选地声明或定义在其相关联的未来库方向子子句中列出的标识符以及总是被保留用于任何用途或用作文件范围标识符的标识符。
long
for
return
不保留其他标识符。如果程序声明或定义了一个标识符,而它是在一个上下文中被保留的(除了7.1.4允许的),或者将一个保留的标识符定义为一个宏名,则该行为是未定义的。如果程序删除(使用#undef)上面列出的第一组中标识符的任何宏定义,则行为未定义。此外,C11 7.31描述了 * 未来的库方向 *,其中包括对某些 * 保留标识符 * 模式的描述。TL;DR:printf、scanf和sqrt都是 * 库函数 * 的 * 保留标识符 *。
1条答案
按热度按时间mrwjdhj31#
这些术语(“* 标准标识符 "、“ 预定义函数 *”)都没有出现在ISO C11 standard中。
C11 6.4.1描述了 * 关键字 *,例如
long
、for
和return
。C11 6.4.2将 * 标识符 * 描述为
一个标识符是一个非数字字符(包括下划线_、小写和小写拉丁字母以及其他字符)和数字的序列,它表示6.2.1中描述的一个或多个实体。小写字母和小写字母是不同的。对标识符的最大长度没有具体限制。
当在翻译阶段7期间将预处理标记转换为标记时,如果预处理标记可以转换为关键字或标识符,则将其转换为关键字。
C11 7.1.2描述了 * 标准头文件 * 和 * 库函数 *。
C11 7.1.3将 * 保留标识符 * 描述为
每个头部声明或定义在其相关联的子子句中列出的所有标识符,并且可选地声明或定义在其相关联的未来库方向子子句中列出的标识符以及总是被保留用于任何用途或用作文件范围标识符的标识符。
不保留其他标识符。如果程序声明或定义了一个标识符,而它是在一个上下文中被保留的(除了7.1.4允许的),或者将一个保留的标识符定义为一个宏名,则该行为是未定义的。
如果程序删除(使用#undef)上面列出的第一组中标识符的任何宏定义,则行为未定义。
此外,C11 7.31描述了 * 未来的库方向 *,其中包括对某些 * 保留标识符 * 模式的描述。
TL;DR:
printf
、scanf
和sqrt
都是 * 库函数 * 的 * 保留标识符 *。