单引号、双引号和C/C++中的sizeof('a')

58

我看了这个问题:在C或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  

1
可能是在C/C++中字符'a'的大小的重复问题。 - Bo Persson
1
我实际上对 sizeof("a") : 2 感到惊讶 - 这么多年来,我一直认为它与 sizeof(char*) 相同 - 如果我知道它不同,我可能会使用它。 - user180247
2个回答

61
在C语言中,像'a'这样的字符常量的类型为int,而在C ++中则为char
关于最后一个问题,是的,
char ch = 'a';

int 隐式转换为 char


+1:@Pratt:在20世纪70年代的C语言中,intgetc()函数的返回类型。它使用-1来表示EOF,这也是许多其他与char表达式频繁处理的事情的方便约定,比如用于字符断点处理的数组索引,字符字符串转换(如stricmp())等。 - wallyk
3
getc()仍然返回int类型,并且返回EOF表示没有更多的字符可读。EOF被定义为负的int值,通常为-1 - Keith Thompson
3
C++改变规则的原因是因为可以重载函数。 - Jesse Good
非常好的主题,答案和评论。 :) - The Mask
@KeithThompson getc和其他类似函数返回的int类型与字符常量的int类型不同!字符常量可能是负数,但是getc返回的都是非负值。那些本应为负数的字符值会被调整为模UCHAR_MAX+1 - M.M
@M.M:我不确定你所说的“不同类型的int”是什么意思。是的,字符常量可以是负数(但只有在普通char被标记为有符号时,并且只适用于基本执行字符集之外的值)。当然,getc()可以返回EOF,它是负数。 - Keith Thompson

1

因为没有字符,只有与字符相关联的整数。

比如说,a是62吧。

如果你尝试使用printf("%c",62);,你会看到一个字符。


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