有什么我可以在C中做,但我不能用C ++做?

时间:2009-02-04 19:59:00

标签: c++ c

我能用C做些什么,但我不能用C ++做什么? 我在样本面试问题网站上偶然发现了这个问题......

22 个答案:

答案 0 :(得分:42)

声明一个名为'class'的变量,如:

int class = 0;

答案 1 :(得分:22)

这是与C ++不兼容的detailed list C功能。

答案 2 :(得分:20)

  

...我在C中可以做任何事情,但在C ++中却没有。

两种语言都是图灵完备的,所以理论上你可以在两者中编写同样功能的应用程序。

OTOH,C ++不是C的超集。特别是C99具有C ++没有的一些功能。例如。指定的初始值设定项,结构中的可变长度数组和自动变量。根据你的“任何东西”,这可能是C ++不能做但C可以做的事情。

答案 3 :(得分:15)

在C中,你可以创建数组文字(“复合文字”),但在C ++中你不能

/* p points to the first element of an array of 4 int */
int *p = (int[]){1, 2, 3, 4};

你也可以在编译时创建一个大小尚未知的数组,但是C ++没有这种可能性(“可变长度数组”):

// create array. size is known at runtime only.
int p[rand() % 5 + 1];

答案 4 :(得分:10)

int new = 0;

在C中工作,但显然无法在C ++中工作,因为“new”是一个保留字。

还有其他一些带有保留字的'技巧',但除此之外,你几乎可以用C语言做C中的所有事情。

答案 5 :(得分:6)

有些事情你可以在C语言中你不能用C ++(因为C ++有更严格的语法检查,而C有更广泛的'遗留'语法)。

此外,可能有一些运行时环境(O / S +库+编译器)支持C但不支持C ++,所以你可以在那些你不能做的平台上 C C ++。

答案 6 :(得分:6)

C ++缺少C99的restrict qualifier。因此,没有办法告诉编译器基于知道指针不是别名来执行优化。

答案 7 :(得分:6)

相当多的事情。例如,在C中,您可以编写如下代码:

void * v = 0;
char * p = v;

你可以创建这样的数组:

int main() {
    int n = 42;
    int a[n];
    return 0;
}

它们都不会在C ++下编译。

答案 8 :(得分:5)

从语法上讲,你可以在C中编写一些不能用C ++编译的东西(参见Incompatibilities Between ISO C and ISO C++的详细信息。)。如果您要求更高级别,如果有一些程序可以用C语言编写,但不能用C ++编写,那么答案是“否”。

答案 9 :(得分:3)

在'C'中你不需要前向声明。这允许您传递错误解释的参数。 (不是说这是一个很棒的功能,但你不能用C ++做)

文件A中的

float sum(float a, float b)
{
   return a+b;
}
文件B中的

main()
{
  printf("%f\n", sum(1,2));
}

使用C,编译,但打印0.000

使用C ++,在printf之前需要float sum(float,float);,它会给出预期的结果。

答案 10 :(得分:3)

你可以在C中稀疏地初始化数组。我喜欢用它来映射int-> sometype用于相对密集的静态映射,其中未映射的值可以解释为0:

int my_array[] = { [1] = 3, [4] = 2 };
printf("%d %d %d\n", sizeof my_array, my_array[0], my_array[1]);
/* prints 20, 0, 3 */

答案 11 :(得分:3)

实际上,我可以想到一个例子:

当您创建要由其他应用程序共享的库(.lib文件或.dll文件)时,最好使用C而不是C ++,因为结果更具可移植性。您可以使用'extern“C”'块在C ++编译器中执行此操作。

具体来说,C ++有一个怪癖,其中没有名称修改的标准约定 - 用于将库的函数签名转换为编译器使用的更低级别的名称。因此,例如,如果您有一个类似'int addNumbers(int a,int b)'的函数,不同的C ++编译器可能会将此函数转换为不同的名称,这可能会导致您想要导入库时出现问题。如果你使用C编译器或用C块包围你的库导入和导出代码,虽然你不会看到这个问题,因为只有一种方法来破坏C中的函数名。

答案 12 :(得分:2)

1998 C ++标准列出了与1990 C标准不相容的列表,长度为13页(附件C)。当然,与描述这些语言的页面数量相比,它并不是很多,但仍然可以放弃一些基础。

它列出的差异类型的快速摘要:

  • 添加了新关键字(任何使用它们作为标识符的C程序都不是C ++)
  • 字符文字的类型从int更改为char(在C和C ++中比较sizeof('a')!)
  • 字符串文字构成const(不能做char* q = expr ? "abc" : "de";
  • “暂定义”将从语言中删除。
  • “兼容类型”已从语言中删除。
  • 从void *转换为任何其他指针现在需要强制转换。
  • 从任何const / volatile指针转换为void *现在需要强制转换。
  • “隐式声明”将从语言中删除。
  • 表达式无法再创建新类型(如p = (void*)(struct x {int i;} *)0;
  • 某些表达式的结果变为左值(比较sizeof(0, arr)的{​​{1}})

......这是附件C的前3页。

如果你遵守1999 C标准,差异将永远描述。尽管C ++ 0x确实包含了一些C99功能,但其中许多功能本质上是不兼容的,就像复杂类型一样。

答案 13 :(得分:2)

char *c = malloc(sizeof(char));

在C中有效,而不是C ++,即自动转换void*。这当然是一个语法问题,而不是你能做什么,不能_do_(即完成)。

答案 14 :(得分:2)

您可以使用任何编程语言执行几乎所有操作。当然,表达它的方式会有所不同,代码量,代码清晰度,进一步维护的便利性也会有所不同。有些任务可以用Prolog中的几行编写,用C ++编写几页代码,依此类推。

一些限制因素是可用库,可用编译器和低级问题。但是,当您在典型的PC上考虑C和C ++时,可以在其中任何一个中完成的事情没有区别。

除非你当然要求C和C ++之间的差异 - 因为其他人已经给你了这个想法。

答案 15 :(得分:2)

如果标准是解决特定的编程问题,那么两者都可以完成这项工作,尽管在某些情况下由于抽象级别较高而在C ++中执行它可能会更容易一些

答案 16 :(得分:1)

在C中,您可以声明以下变量:

int bool, class, new, delete, template, typename, this, throw, catch, 
    typeid, operator, virtual, static_cast, reinterpret_cast, 
    dynamic_cast, mutable, public, private, protected, friend; //many more

然后你可以这样做:

int namespace = private + protected + public;
int decltype  = static_cast + dynamic_cast + reinterpret_cast;
int constexpr = (new + delete) * (template + typename);

所有这些都是C ++ 11中的关键词。

答案 17 :(得分:1)

这是指最新的C标准吗?最初的C标准(ANSI 1989或ISO 1990,1995更新)非常接近于C ++的子集。存在差异,但它们大部分都是人为的(最大的例外可能是void *可以自由地转换为C中的任何数据指针而不是C ++中的数据指针。)

然而,new C standard出现在1999年,在我停止在最现代化的C中做任何事情之后的一段时间。它有新功能,其中一些在今年或下一年将进入C ++标准,但不是全部。

答案 18 :(得分:1)

简短的回答是......不,不是真的。见http://www.research.att.com/~bs/bs_faq.html#difference

答案 19 :(得分:0)

“如果无法在装配中完成,那就不值得做了!”

好吧,幽默一边,我 THINK OP在语法上要求,而不是在操作上。

我认为在C语言中有一些合法的东西是合法的(至少是C89)在C ++中是不合法的,或者至少被弃用......但是(如果它们存在的话)它们是相当模糊的。 C ++在功能上是C的超集。

答案 20 :(得分:0)

C ++不支持命名结构成员初始化,在C中你可以这样做:

struct {int x,y; } a = {。x = 3};

您还可以将其与Matt Havener显示的功能结合使用:

struct {int a [3],b; } w [] = {[0] .a = {1},1。a [0] = 2};

答案 21 :(得分:0)

C ++显然不是C的超集,原因很简单:C ++中添加了新的关键字 class,virtual,new等因此不能再用作C ++中的标识符。

有些原因比较微妙 你可以在Bjarn Stroustrup的网站上找到这个问题的详尽答案: The C++ programming language | Appendix B