猿问

以每种语言编译时,在C和C ++中都有效的代码能否产生不同的行为?

C和C ++有很多区别,并非所有有效的C代码都是有效的C ++代码。
(“有效”是指具有定义行为的标准代码,即不是特定于实现的/未定义的等。)

在任何情况下,使用每种语言的标准编译器进行编译时,在C和C ++中都有效的一段代码会产生不同的行为吗?

为了使其成为合理/有用的比较(我试图学习一些实用的东西,而不是试图在问题中发现明显的漏洞),我们假设:

  • 与预处理器无关(这意味着不会与#ifdef __cplusplus,编译指示等发生冲突)

  • 实现定义的任何内容在两种语言中都是相同的(例如,数值限制等)

  • 我们正在比较每个标准的合理最新版本(例如C ++ 98和C90或更高版本)。
    如果版本很重要,请说明每个标准的哪个版本会产生不同的行为。


慕田峪9158850
浏览 501回答 3
3回答

人到中年有点甜

以下内容(在C和C ++中有效)将(很可能)i在C和C ++中导致不同的值:int i = sizeof('a');有关差异的说明,请参见C / C ++中的字符大小('a')。本文中的另一个:#include <stdio.h>int&nbsp; sz = 80;int main(void){&nbsp; &nbsp; struct sz { char c; };&nbsp; &nbsp; int val = sizeof(sz);&nbsp; &nbsp; &nbsp; // sizeof(int) in C,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sizeof(struct sz) in C++&nbsp; &nbsp; printf("%d\n", val);&nbsp; &nbsp; return 0;

慕尼黑8549860

这是一个利用C和C ++中的函数调用和对象声明之间的区别以及C90允许调用未声明函数的事实的示例:#include <stdio.h>struct f { int x; };int main() {&nbsp; &nbsp; f();}int f() {&nbsp; &nbsp; return printf("hello");}在C ++中,由于f创建和销毁了一个临时文件,因此不会打印任何内容,但在C90中,hello由于可以在不声明函数的情况下调用函数,因此不会打印任何内容。如果您想知道该名称f是否被两次使用,则C和C ++标准明确允许这样做,并且要创建一个对象,您必须说清楚struct f是否要使用结构,或者struct要取消使用要使用的功能。

GCT1015

对于C ++和C90,至少存在一种获得未定义实现的不同行为的方法。C90没有单行注释。稍加注意,我们就可以使用它来创建一个在C90和C ++中具有完全不同结果的表达式。int a = 10 //* comment */ 2&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; + 3;在C ++中,从//到行尾的所有内容均为注释,因此其结果如下:int a = 10 + 3;由于C90没有单行注释,因此只有/* comment */是注释。第一部分/和2都是初始化的一部分,因此得出:int a = 10 / 2 + 3;因此,一个正确的C ++编译器将提供13,但一个完全正确的C90编译器将给8。当然,我在这里选择了任意数字-您可以视需要使用其他数字。
随时随地看视频慕课网APP
我要回答