【问题标题】:return value of sizeof() operator in C & C++ [duplicate]C和C ++中sizeof()运算符的返回值[重复]
【发布时间】:2013-11-08 15:02:06
【问题描述】:
#include<stdio.h>
int main()
{
    printf("%d", sizeof('a'));
    return 0;
}

为什么上面的代码在 C 和 C++ 中编译时会产生不同的结果? 在 C 中,它打印 4 而在 C++ 中,这是更可接受的答案,即 1。
当我用 main 函数中声明的 char 变量替换 sizeof() 中的 'a' 时,两种情况下的结果都是 1!

【问题讨论】:

  • 是什么让14 更容易接受?
  • @Paddyd 因为sizeof(char) 在 C 和 C++ 中都是 1
  • @Paddyd 因为 char 的大小!我不知道这种差异,所以 1 很明显

标签: c++ c compiler-construction


【解决方案1】:

因为,这可能令人震惊,C 和 C++ 不是同一种语言

C 将字符文字定义为具有 int 类型,而 C++ 认为它们具有 char 类型。

这是多字符常量很有用的情况:

const int foo = 'foo';

这将生成一个整数,其值可能是 6713199 或 7303014,具体取决于字节顺序和编译器的心情。换句话说,多字符字面量不是“可移植的”,你不能依赖于容易预测的结果值。

正如评论者所指出的(谢谢!)这在 C 和 C++ 中都有效,似乎 C++ 使多字符字符文字成为不同的类型。聪明!

另外,作为我喜欢在讨论主题时提及的一个小提示,请注意sizeof 不是函数,size_t 的值不是int。因此:

printf("the size of a character is %zu\n", sizeof 'a');

或者,如果您的编译器太旧而不支持 C99:

printf("the size of a character is %lu\n", (unsigned long) sizeof 'a');

代表打印您正在调查的尺寸的最简单和最正确的方法。

【讨论】:

  • C++ 也有多字符文字,类型为int 和实现定义的值。
  • 为什么我在使用%zu时得到warning: unknown conversion type character 'z' in format
  • +1 强调编译器喜怒无常:-)
  • @mjs:他们确实是;但在这种情况下,它是实现定义的(不是未定义或未指定的),因此编译器应该记录它所做的事情,并且不管它的心情如何。
【解决方案2】:

在 C 中,'a' 是字符常量,被视为整数,因此大小为 4,而在 C++ 中,它被视为字符。

可能重复的问题Size of character ('a') in C/C++

【讨论】:

    【解决方案3】:

    您的示例是 C++ 与 C 不兼容的情况之一。在返回单个字符(如 getch)的 C API 中,返回和 int,因为这为 EOF 标记 (-1) 留出了空间。因此,出于这个原因,它将“c”视为一个 int。

    C++ 引入了运算符和函数重载,这意味着我们可能想要处理

    cout << 'c'
    

    不同于:

    cout << 99
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2013-04-04
      • 2012-04-26
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多