Tag: 标准

C预处理器是否删除了“&*”的实例?

我正在玩gcc并尝试以下代码: int A = 42; int *B = &A; int *C = &*B; 和C == &A ,如预期的那样。 但是当我尝试: int *B = NULL; int *C = &*B; 原来C == NULL ,没有段错误。 所以&*B在取得地址之前实际上并没有取消引用B 我的猜测是预处理器在它们甚至到达编译器之前就剥离了&*和*&实例,因为它们互相否定,但我找不到任何文档来validation这是标准C还是特定于编译器。 预处理器是否会剥离&*和*& ,我可以从任何给定的编译器中获得这种行为吗?

C标准是否有缺陷报告的网站?

在我之前的问题中 ,讨论似乎意味着C标准可能存在缺陷,最重要的回答者的最后一句话进一步暗示: 该标准的作者只是忽略了这样说。 我知道C ++有一个在线网站,您可以在其中搜索缺陷报告,即这里是我搜索空指针常量 ,但C标准是否有类似的东西?

C11标准文档

从这个受SO保护的问题开始,我试图了解这些文件之间的区别: 9899 2012年成本$60 9899 2011年成本$265 正如你所看到的那些文件的价格差别很大,我不知道更便宜的文件是否有效,或者类似于真实标准的草稿或剪切副本。 有人买了INCITS吗? 编辑 正如@Chqrlie所指出的那样: 免费提供的ANSI和ISO官方文件与最终草案之间的区别是什么,可从官方网站 open-std.org/jtc1/sc22/wg14/www/docs/n1570 免费获取 。 PDF格式

“GNU C中的语句和声明”是否特定于GNU C?

表达式中的语句和声明是否特定于GNU C? 或者这个function也包含在C99标准中?

子表达式评估顺序

我在J.1未指明的行为下查看了SO / IEC 9899:201x : “The order in which subexpressions are evaluated and the order in which side effects take place, except as specified for the function-call (), &&, ||, ?:, and comma operators (6.5).” 这是否意味着 func1() + func2(); func2()可以在func1()之前执行,或者甚至在func1()期间执行?

对C标准有任何限制,允许将函数实现为宏吗?

通常,除了提供函数声明之外,C标准头文件还可以提供“屏蔽宏”以使事情更快。 例如,如果我包含ctype.h ,则头文件将声明 int isdigit(int c); 但它也可能用宏掩盖声明。 我相信这是一个根据C标准的便携式isdigit宏: #define isdigit(c) ((c) >= ‘0’ && (c) <= '9') 当然,这个宏也很危险,因为如果在定义宏时执行此操作会引入未定义的行为: int c = ‘A’; printf(“%d\n”, isdigit(c++)); 为了避免UB在这个假设的情况下,我必须用parens: (isdigit)(c++)包围函数名。 所以,我的问题是:标准头可以定义哪种屏蔽宏有什么限制吗? 如果参数表达式有副作用,或者它们在技术上是否允许具有奇怪的行为(例如我们在上面看到),它们是否保证不会导致未定义的行为? 限制在哪里?

为什么size_t当int足以满足数组的大小?

C标准保证int能够存储每个可能的数组大小。 至少,这是我从阅读§6.5.2.1,第1小节(数组下标约束)中理解的内容: 其中一个表达式应具有类型”指向对象类型的指针”,另一个表达式应具有整数类型,结果具有类型”type”。 既然我们将int s用作数组下标,为什么我们应该使用size_t来确定数组的大小? 为什么strlen()在int足够时返回size_t ?

位操作的标准(跨平台)方式

由于是数字的不同二进制表示(例如,采取大/小端),这是跨平台: // NOTE: FIXED-SIZE unsigned integral type some_unsigned_type variable = some_number; // set n-th bit, starting from 1, // right-to-left (least significant-to most significant) variable |= ( 1 << ( n – 1 ) ); // clear the same bit: variable &= ~( 1 << ( n – 1 ) ); 换句话说,编译器是否总是处理固定大小的无符号数的不同二进制表示,或者它是特定于平台的? 如果variable是有符号整数类型(例如, int )并且其值是 […]

如何编写ANSI C控制台屏幕缓冲区?

我正在制作一个基于ASCII的游戏,而且我看起来人们都说要使用来自MSDN的Console.Write(),如果你使用的是Windows,那就是花花公子,但我不是。 因此,我正在尝试在C中编写一个函数或一组函数,它们可以在两个屏幕缓冲区之间交替,并将它们写入屏幕,类似于手册页,以及pico,vim和emacs的。 我有缓冲区正在工作,并发现一个名为0verkill的旧的ASCII游戏,它使用C和putchar()将每个字符放在屏幕上,但我尝试重新创建它,导致文本连续流动,而不是窗口大小的静态文本面板。 我真的不想使用像curses这样的任何外部库(因为这会降低可移植性),并且如果可能的话,我希望保持ansi标准。 谢谢!

在C / C ++中编写非打印字符的行为是什么?

如果字符是通过printf / fprintf编写的,那么编写非打印字符的行为是未定义的还是实现定义的? 我很困惑,因为C标准N1570 / 5.2.2中的单词仅涉及打印字符和字母转义序列的显示语义。 另外,如果字符是通过std::ostream (仅限C ++)编写的,该怎么办?