不同编译器编译C和C++代码输出结果不同。

12

你能想到一个程序,对于C和C++编译器会输出不同的结果(但在相同语言下会给出一致的输出)吗?


9
这是一个愚蠢的面试问题。 - BЈовић
7个回答

20

ISO C和ISO C++之间的不兼容性

一个常见的例子是sizeof('A'),在C中通常为4,在C++中始终为1,因为类似'A'的字符常量在C中具有类型int,而在C++中具有类型char

#include <stdio.h>

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

1
运算符 sizeof 返回的是 size_t 而不是 int。因此你的代码包含错误。https://dev59.com/XHNA5IYBdhLWcg3wfd8m - UmmaGumma
sizeof (int) 可能是1。 - Keith Thompson

20

在C ++或C99中,此程序输出12,而在C89中则输出6

#include <stdio.h>

int main()
{
    int a = 12//**/2;
    ;

    printf("%d\n", a);
    return 0;
}

虽然准确,但我更倾向于将其视为一种技巧 :) 不过还是不错的。 - Matthieu M.
1
然而,那并没有真正回答问题,对吧?它在C和C++中产生相同的输出(毕竟C99是当前的C标准)。 - Keith Thompson
@KeithThompson:是的,ecik的回答更准确地匹配了这个问题。 - caf

9
int main() { return sizeof 'a'; }

2
但并非完全可移植。如果 sizeof(int) == 1(仅当 CHAR_BIT >= 16 时可能),则在 C 中 sizeof 'a' 可能为 1。 - Keith Thompson

5
typedef char X;
int main() {
    struct X { double foo; }
    printf("%d\n", sizeof(X));
    return 0;
}

1
缺失 #include <stdio.h>"%d" 需要一个 int 参数而非 size_t。符合规范的实现可能会出现 sizeof (struct X) == 1 的情况(例如,CHAR_BIT == 64),可通过将 struct X 定义为两个 char 成员替代使用 double 来修复。 - Keith Thompson

4

以下内容来自维基百科,已经进行修改以产生每种语言中的一致输出:

extern int T;

int size(void)
{
    struct T {  int i;  int j;  };

    return sizeof(T) == sizeof(int);
    /* C:   return 1
    *  C++: return 0
    */
}

这将根据语言返回不同的状态,但不会产生任何输出 - Keith Thompson

3
int class;

这段代码无法在C++中编译,但可以在C语言中编译。


哇!!许多想法都在一个地方...不错.. - Aditya369
1
问题是关于程序输出,而不是编译器输出。 - Björn Pollex

2
#include <stdio.h>
int main(void)
{
#ifdef __cplusplus
    puts("C++");
#else
    puts("C");
#endif
    return 0;
}

预处理器是语言的一部分吗? - harper
@harper:是的。这是C99标准的第6.10节,C++标准的第16节。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接