使用 C89 和 C99 编译时,哪些 C 程序在运行时的行为有所不同?
我发现以下代码片段(我认为在维基百科中)在识别 C++ 注释时创建了一个与未识别时不同的运行时:
int a = 4 //* This is a comment, but where does it end? */ 2
;
但到目前为止,这是唯一的一个(不包括变体)。
我对使用 __STDC__ 等进行区分不感兴趣,也不对 C89 无法编译的程序感兴趣。
是否有其他程序/片段使用 C89 生成与 C99 不同的运行时?
I found the following snippet (I think in Wikipedia) that creates a different run-time when C++ comments are recognized than when not:
int a = 4 //* This is a comment, but where does it end? */ 2
;
But until now that's been the only one (variants excluded).
I'm not interested in differentiating using __STDC__
and the like, and not in programs that C89 will not compile.
Are there other programs/snippets producing a different run-time with C89 than C99?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
该程序将在符合要求的 C89 实现上打印
0.000000
,在符合要求的 C99 实现上打印1.000000
:This program will print
0.000000
on a conforming C89 implementation and1.000000
on a conforming C99 implementation:两个示例:
C99 将
-3/2
作为已定义行为(即截断为零)。C99 将
-1<<1
作为未定义行为(但不是 C89)。另外,过去我遇到过 64 位枚举的问题,例如
enum {mask = 1ULL << 32}
,但我不记得编译器是否保持沉默,或者只是悄悄地做了错误的事情。Two examples:
C99 has
-3/2
as Defined Behaviour (namely, to truncate to zero).C99 has
-1<<1
as Undefined Behaviour (but not C89).Also, in the past I've run into problems with 64-bit enums, such as
enum {mask = 1ULL << 32}
, but I don't recall if the compiler was silent, or just quietly did the wrong thing.整数除法可能会产生不同的结果,具体取决于您使用的 c89 实现。
是 ANSI C 还是 ISO C 指定 -5 % 10 应该是什么?
Integer division can produce a different result, depending on which c89 implementation you used.
Does either ANSI C or ISO C specify what -5 % 10 should be?