我能用C做些什么,但我不能用C ++做什么? 我在样本面试问题网站上偶然发现了这个问题......
答案 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)。当然,与描述这些语言的页面数量相比,它并不是很多,但仍然可以放弃一些基础。
它列出的差异类型的快速摘要:
sizeof('a')
!)char* q = expr ? "abc" : "de";
)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