【问题标题】:Single, double quotes and sizeof('a') in C/C++C/C++ 中的单引号、双引号和 sizeof('a')
【发布时间】:2012-05-23 07:45:24
【问题描述】:

我在看问题Single quotes vs. double quotes in C or C++。我无法完全理解给出的解释,所以我编写了一个程序:

#include <stdio.h>
int main()
{
  char ch = 'a';
  printf("sizeof(ch) :%d\n", sizeof(ch));
  printf("sizeof(\'a\') :%d\n", sizeof('a'));
  printf("sizeof(\"a\") :%d\n", sizeof("a"));
  printf("sizeof(char) :%d\n", sizeof(char));
  printf("sizeof(int) :%d\n", sizeof(int));
  return 0;
}

我使用 gcc 和 g++ 编译它们,这些是我的输出:

gcc:

sizeof(ch)   : 1  
sizeof('a')  : 4  
sizeof("a")  : 2  
sizeof(char) : 1  
sizeof(int)  : 4  

g++:

sizeof(ch)   : 1  
sizeof('a')  : 1  
sizeof("a")  : 2  
sizeof(char) : 1  
sizeof(int)  : 4  

g++ 输出对我来说很有意义,对此我没有任何疑问。在 gcc 中,sizeof('a')sizeof(char) 有什么不同?背后有什么实际原因还是只是历史原因?

同样在 C 中如果 char'a' 有不同的大小,这是否意味着当我们写 char ch = 'a';,我们在做隐式类型转换?

【问题讨论】:

  • 我实际上对sizeof("a") : 2 感到惊讶——这些年来,我一直认为这与sizeof(char*) 相同——如果我不知道的话,我可能真的会使用它。跨度>

标签: c++ c gcc


【解决方案1】:

在 C 中,'a' 等字符常量的类型为 int,在 C++ 中为 char

关于最后一个问题,是的,

char ch = 'a';

导致 intchar 的隐式转换。

【讨论】:

  • +1: @Pratt: 在 1970 年代的 C 用法中,intgetc() 的返回类型。它使用 -1 来表示 EOF,这对于经常使用 char 表达式完成的许多其他事情来说也是一个方便的约定,例如索引到数组以进行字符中断处理、字符字符串转换(如 stricmp())等。
  • @wallyk: getc() 仍然返回int,它仍然返回EOF 表示没有更多的字符要读取。 EOF 定义为负的int 值;通常是-1
  • 而C++改变规则的原因是因为你可以重载函数。
  • 非常好的话题、答案和 cmets。 :)
  • @KeithThompson 由getc 和朋友返回的int 是与字符常量不同的int!字符常量可能是负数,但getc 都是非负值。负字符值会以 UCHAR_MAX+1 为模调整。
【解决方案2】:

因为没有 char 只是 intgers 链接到一个字符

我猜 a 是 62

如果你尝试 printf("%c",62);你会看到一个角色

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2011-04-10
    • 1970-01-01
    • 2022-06-16
    • 2013-02-16
    • 2011-05-08
    相关资源
    最近更新 更多