vlambda博客
学习文章列表

【中英双语】C语言编程标准

这是 程序员每日英语 的第 18 篇分享
感谢关注,点赞,转发
回复“加群”拉你加入高质量交流及分享群

这是双语编程学习 - C语言篇的第2篇文章,感谢关注,点赞,转发!



The idea of this article is to introduce C standard. 

本文的思路是介绍C标准。

What to do when a C program produces different results in two different compilers? 

当一个C程序在两个不同的编译器中产生不同的结果时,该怎么办?

For example, consider the following simple C program. 

例如,请考虑以下简单的 C 程序。

1void main() {  }


The above program fails in gcc as the return type of main is void, but it compiles in Turbo C. How do we decide whether it is a legitimate C program or not? 

上述程序在gcc中编译失败,因为main的返回类型是无效的,但它可以在Turbo C中编译。我们如何决定它是否是一个合法的C程序?

Consider the following program as another example. It produces different results in different compilers. 

将以下程序视为另一个示例。它在不同的编译器中产生不同的结果。

 1#include<stdio.h>
2int main()
3
{
4    int i = 1;
5    printf("%d %d %d\n", ++i, i++, i);
6
7    return 0;
8}
9
10/*output
112 1 3 - using g++ 4.2.1 on Linux.i686
121 2 3 - using SunStudio C++ 5.9 on Linux.i686
132 1 3 - using g++ 4.2.1 on SunOS.x86pc
141 2 3 - using SunStudio C++ 5.9 on SunOS.x86pc
151 2 3 - using g++ 4.2.1 on SunOS.sun4u
161 2 3 - using SunStudio C++ 5.9 on SunOS.sun4u
17*/



Which compiler is right?

The answer to all such questions is C standard. In all such cases, we need to see what C standard says about such programs.

哪个编译器是正确的? 

所有这些问题的答案都是C标准。在所有这些情况下,我们需要看看C标准对此类程序的看法。

What is C standard? 

The latest C standard is ISO/IEC 9899:2011, also known as C11 as the final draft was published in 2011. Before C11, there was C99. The C11 final draft is available here. See this for a complete history of C standards.

什么是C标准?(标准文档见文末)

最新的C标准是ISO/IEC 9899:2011,也称为C11,因为最终草案于2011年发布。在C11之前,有C99。C11 最终草案可在此处获取。有关 C 标准的完整历史,请参阅此内容。

Can we know the behavior of all programs from C standard? 

C standard leaves some behavior of many C constructs as undefined and some as unspecified to simplify the specification and allow some flexibility in implementation. For example, in C the use of any automatic variable before it has been initialized yields undefined behavior and order of evaluations of subexpressions is unspecified. This specifically frees the compiler to do whatever is easiest or most efficient, should such a program be submitted.

我们可以从C标准中知道所有程序的行为吗? 

C标准将许多C构造的某些行为保留为未定义,一些行为未指定,以简化规范并允许实现的一些灵活性。例如,在 C 中,在初始化之前使用任何自动变量都会产生未定义的行为,并且子表达式的计算顺序未指定。这特别释放了编译器,以便在提交此类程序时执行最简单或最有效的操作。

So what is the conclusion about above two examples? 

Let us consider the first example which is “void main() {}”, the standard says following about prototype of main().

那么,关于上述两个例子的结论是什么呢? 

让我们考虑第一个例子,即“void main() {}”,标准说下面关于main()的原型。

The function called at program startup is named main. 
The implementation declares no prototype for this function. 
It shall be defined with a return type of int and with no parameters:
       int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names 
may be used, as they are local to the function in which they are declared):
       int main(int argc, char *argv[]) { /* ... */ }
or equivalent;10) or in some other implementation-defined manner.

/*
程序启动时调用的函数被命名为 main。实现 没有为此函数声明任何原型。它应该用返回 类型的 int 定义,并且没有参数: 

int main(void) { /* ... */ } 

或两个参数(这里称为 argc 和 argv,尽管可以使用任何名称 ,因为它们是声明它们的函数的本地名称): 

int main(int argc, char *argv[]) { /* ... */ } 

或等效;10) 或以某种其他实现定义的方式。
*/


So the return type void doesn’t follow the standard, and it’s something allowed by certain compilers.

Let us talk about second example. Note the following statement in C standard is listed under unspecified behavior.

因此,返回类型 void 不遵循标准,这是某些编译器允许的。 

让我们谈谈第二个示例。请注意,C 标准中的以下语句列在“未指定的行为”下。

The order in which the function designator, arguments, and 
subexpressions within the arguments are evaluated in a function 
call (6.5.2.2). 

/*
在函数 调用 (6.5.2.2) 中计算参数中的函数指示符、参数和子表达式的顺序。
*/


What to do with programs whose behavior is undefined or unspecified in standard? 

As a programmer, it is never a good idea to use programming constructs whose behavior is undefined or unspecified, such programs should always be discouraged. The output of such programs may change with the compiler and/or machine.

如何处理行为未定义或未在标准中指定的程序? 

作为程序员,使用行为未定义或未指定的编程结构绝不是一个好主意,应始终不鼓励使用此类程序。此类程序的输出可能会随编译器和/或机器而更改。 


参考资料:

[1]ISO/IEC 9899:2011 - C11 (C standard revision)

https://en.wikipedia.org/wiki/C11_(C_standard_revision)

[2]C99

https://en.wikipedia.org/wiki/C99

[3]C (programming language) history

https://en.wikipedia.org/wiki/C_(programming_language)#History


END



扫描下方二维码

添加好友,备注【英语

可私聊交流,也可进资源丰富学习群


点击阅读原文,获取更多精品学习资源