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

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

为了做一个合理/有用的比较(我试图学习一些实际有用的东西,而不是试图在问题中找到明显的漏洞),让我们假设:

与预处理器无关(这意味着没有使用#ifdef __cplusplus、pragmas等进行hack) 在这两种语言中,任何实现定义都是相同的(例如数字限制等)。 我们比较每个标准的最新版本(例如,c++ 98和C90或更高版本) 如果版本很重要,那么请说明每个版本会产生不同的行为。


当前回答

另一个例子,我还没有看到提到,这个突出了预处理器的差异:

#include <stdio.h>
int main()
{
#if true
    printf("true!\n");
#else
    printf("false!\n");
#endif
    return 0;
}

这在C中打印“false”,在c++中打印“true”——在C中,任何未定义的宏的计算结果为0。在c++中,有一个例外:"true"的值为1。

其他回答

C90 vs. c++ 11 (int vs. double)

#include <stdio.h>

int main()
{
  auto j = 1.5;
  printf("%d", (int)sizeof(j));
  return 0;
}

在C语言中,auto表示局部变量。在C90中,可以省略变量或函数类型。它默认为int。在c++ 11中,auto的意思完全不同,它告诉编译器从用于初始化变量的值推断变量的类型。

对于C++11标准:

a.逗号操作符在C中执行左值到右值的转换,但在c++中不执行:

   char arr[100];
   int s = sizeof(0, arr);       // The comma operator is used.

在c++中,这个表达式的值是100,在C中是sizeof(char*)。

b.在c++中,枚举器的类型是它的枚举。在C语言中,枚举数的类型是int。

   enum E { a, b, c };
   sizeof(a) == sizeof(int);     // In C
   sizeof(a) == sizeof(E);       // In C++

这意味着sizeof(int)可能不等于sizeof(E)。

c.在c++中,用空参数列表声明的函数不带参数。在C语言中,空参数列表意味着函数参数的数量和类型是未知的。

   int f();           // int f(void) in C++
                      // int f(*unknown*) in C
#include <stdio.h>

int main(void)
{
    printf("%d\n", (int)sizeof('a'));
    return 0;
}

在C语言中,这将打印当前系统中sizeof(int)的值,在目前使用的大多数系统中,这通常是4。

在c++中,这必须打印1。

int main(void) {
    const int dim = 5; 
    int array[dim];
}

这是相当奇怪的,因为它在c++和C99, C11和C17中是有效的(尽管在C11, C17中是可选的);但在C89中无效。

在C99+中,它创建了一个变长数组,与普通数组相比,它有自己的特性,因为它是运行时类型而不是编译时类型,并且sizeof数组在C中不是整数常量表达式。在c++中,该类型完全是静态的。


如果你尝试在这里添加初始化式:

int main(void) {
    const int dim = 5; 
    int array[dim] = {0};
}

是有效的c++,但不是C,因为变长数组不能有初始化式。

另一个例子,我还没有看到提到,这个突出了预处理器的差异:

#include <stdio.h>
int main()
{
#if true
    printf("true!\n");
#else
    printf("false!\n");
#endif
    return 0;
}

这在C中打印“false”,在c++中打印“true”——在C中,任何未定义的宏的计算结果为0。在c++中,有一个例外:"true"的值为1。