为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
慕田峪9158850 2019-12-07 13:38:26
C和C ++有很多区别,并非所有有效的C代码都是有效的C ++代码。(“有效”是指具有定义行为的标准代码,即不是特定于实现的/未定义的等。)在任何情况下,使用每种语言的标准编译器进行编译时,在C和C ++中都有效的一段代码会产生不同的行为吗?为了使其成为合理/有用的比较(我试图学习一些实用的东西,而不是试图在问题中发现明显的漏洞),我们假设:与预处理器无关(这意味着不会与#ifdef __cplusplus,编译指示等发生冲突)实现定义的任何内容在两种语言中都是相同的(例如,数值限制等)我们正在比较每个标准的合理最新版本(例如C ++ 98和C90或更高版本)。如果版本很重要,请说明每个标准的哪个版本会产生不同的行为。
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

以下内容(在C和C ++中有效)将(很可能)i在C和C ++中导致不同的值:


int i = sizeof('a');

有关差异的说明,请参见C / C ++中的字符大小('a')。


本文中的另一个:


#include <stdio.h>


int  sz = 80;


int main(void)

{

    struct sz { char c; };


    int val = sizeof(sz);      // sizeof(int) in C,

                               // sizeof(struct sz) in C++

    printf("%d\n", val);

    return 0;


查看完整回答
反对 回复 2019-12-07
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

这是一个利用C和C ++中的函数调用和对象声明之间的区别以及C90允许调用未声明函数的事实的示例:


#include <stdio.h>


struct f { int x; };


int main() {

    f();

}


int f() {

    return printf("hello");

}

在C ++中,由于f创建和销毁了一个临时文件,因此不会打印任何内容,但在C90中,hello由于可以在不声明函数的情况下调用函数,因此不会打印任何内容。


如果您想知道该名称f是否被两次使用,则C和C ++标准明确允许这样做,并且要创建一个对象,您必须说清楚struct f是否要使用结构,或者struct要取消使用要使用的功能。


查看完整回答
反对 回复 2019-12-07
?
GCT1015

TA贡献1827条经验 获得超4个赞

对于C ++和C90,至少存在一种获得未定义实现的不同行为的方法。C90没有单行注释。稍加注意,我们就可以使用它来创建一个在C90和C ++中具有完全不同结果的表达式。


int a = 10 //* comment */ 2 

        + 3;

在C ++中,从//到行尾的所有内容均为注释,因此其结果如下:


int a = 10 + 3;

由于C90没有单行注释,因此只有/* comment */是注释。第一部分/和2都是初始化的一部分,因此得出:


int a = 10 / 2 + 3;

因此,一个正确的C ++编译器将提供13,但一个完全正确的C90编译器将给8。当然,我在这里选择了任意数字-您可以视需要使用其他数字。


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 467 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信