我在看问题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'的大小不同,这是否意味着当我们写

推荐答案

在C中,字符常量(如'a')具有类型int,在C++中为char.

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

char ch = 'a';

导致intchar的隐式转换.

C++相关问答推荐

为指针 struct 创建宏

%p与char* 等组合缺少的GCC Wform警告

Ebpf内核代码:permission denied:invalid access to map value

在struct中调用函数,但struct在void中 *

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

模拟shell并运行.sh文件

Linux不想运行编译后的文件

错误:包含文件时类型名称未知

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

将回调/基于事件的C API转换为非回调API

Linux分段故障(核心转储)

Valgrind用net_pton()抱怨

在Ubuntu上使用库部署C程序的最佳实践

变量值不正确的问题

如果类型是新的,offsetof是否与typeof一起工作?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

struct 中的qsort,但排序后的 struct 很乱

为什么创建局部变量的指针需要过程在堆栈上分配空间?

在 C23 之前如何对空指针使用nullptr?

我怎样才能用c语言正常运行这两个进程?