📜  代码在 C 和 C++ 中都有效,但产生不同的输出

📅  最后修改于: 2021-09-14 02:37:41             🧑  作者: Mango

有一些句法结构对 C 和 C++ 都有效,但在这两种语言中编译和运行时的行为不同。

也可以利用一些差异来创建在两种语言中编译但行为不同的代码。例如,以下函数将在 C 和 C++ 中返回不同的值:

示例代码在 C 和 C++ 中都有效,但在编译时给出不同的答案:

// C code that is valid in both
// C and C++ but produce different
// behavior when compiled.
  
#include 
  
// extern keyword for variable
// declaration without define
extern int S;
  
// function for struct
int differCAndCpp(void)
{
    // create a structure
    struct S {
        int a;
        int b;
    };
  
    // return sizeof integer variable
    return sizeof(S);
}
// Main driver
int main()
{
    // call function differCAndCpp()
    printf("%d", differCAndCpp());
    return 0;
}

输出:

4

C++ 中的代码

// C++ code that is valid in both
// C and C++ but produce different
// behavior when compiled.
  
#include 
using namespace std;
  
// extern keyword used for variable
// declaration without define
extern int S;
  
// function for struct
int differCAndCpp(void)
{
    // create a structure
    struct S {
        int a;
        int b;
    };
  
    // return sizeof structure
    // in c++
    return sizeof(S);
}
  
// Main driver
int main()
{
    // call function differCAndCpp()
    printf("%d", differCAndCpp());
    return 0;
}

输出:

8

我们可以看到两个代码相同但输出不同。这是因为 C 需要结构标记前面的 struct(因此 sizeof(S) 指的是变量),但 C++ 允许省略它(因此 sizeof(S) 指的是隐式 typedef)。

请注意,将 extern 声明放在函数内部时,结果是不同的:那么函数域中同名标识符的存在会阻止隐式 typedef 对 C++ 生效,而对 C 和 C++ 的结果将是相同的。另请注意,上面示例中的歧义是由于使用了 sizeof运算符的括号。

使用 sizeof T 会期望 T 是表达式而不是类型,因此该示例不会给出与 C++ 相同的结果。

相关文章:

  • C 和 C++ 中结构的区别
  • 编写一个程序,在 C 和 C++ 中产生不同的结果

参考:-https://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程