sizeof()函数对于字符常量和函数名的逻辑

25 浏览
0 Comments

sizeof()函数对于字符常量和函数名的逻辑

在C中,上述代码会产生结果1和4。请解释一下逻辑是什么?

此外,为什么sizeof(main())的结果是4,而sizeof(main)的结果是1

在C++中,为什么sizeof('a')的结果是1,但sizeof('av')的结果是4?

0
0 Comments

sizeof()函数用于获取变量或类型的大小,一般以字节为单位。根据上述内容,我们可以得出以下结论:

1. 字符常量是int类型而不是char类型。所以,将字符常量存储在变量c中时,它会被缩短为1个字节,成为char类型。

2. 注意,int类型的大小在不同的实现中可能会有所不同。

3. sizeof(main())的结果是4,而sizeof(main)的结果是1。这是因为在C语言中,字符字面值是int类型,而在C++中,字符字面值是char类型,大小为1个字节。

所以,问题的原因是C语言中字符常量被视为int类型,而在C++中被视为char类型。解决方法是使用C++编译器来编译代码,以确保字符常量的大小为1个字节。

以下是整理的文章:

字符常量和函数名sizeof()背后的逻辑

在C语言中,字符常量被视为int类型而不是char类型。这意味着一个字符常量会被存储为4个字节,而当它被存储在char类型的变量中时,会被缩短为1个字节。

需要注意的是,int类型的大小在不同的实现中可能会有所不同。这意味着在一些实现中,int类型可能会占据4个字节,而在其他实现中可能会占据更多或更少的字节。

那么为什么sizeof(main())的结果是4,而sizeof(main)的结果是1呢?答案在于C语言和C++语言对字符字面值的处理方式不同。

在C语言中,字符字面值被视为int类型,因此它们的大小为4个字节。所以,当我们使用sizeof(main())时,它返回的是main()函数返回值的大小,即4个字节。而当我们使用sizeof(main)时,它返回的是main函数本身的大小,即1个字节。

然而,在C++语言中,字符字面值被视为char类型,大小为1个字节。因此,在使用C++编译器编译代码时,无论是sizeof(main())还是sizeof(main),都会返回1个字节作为结果。

为了确保字符常量的大小为1个字节,我们可以使用C++编译器来编译代码。

总结起来,sizeof()函数用于获取变量或类型的大小。在C语言中,字符常量被视为int类型,大小为4个字节。而在C++语言中,字符常量被视为char类型,大小为1个字节。因此,在使用sizeof()函数时,需要注意不同语言对字符常量的处理方式。

0
0 Comments

在C语言中,字符常量的类型是int,虽然在C++中不是这样。根据C99标准草案第6.4.4.4节第10段所说,整数字符常量的类型为int。一个包含单个字符的整数字符常量的值是映射字符的表示的数值,解释为整数。包含多个字符的整数字符常量(例如,'ab')的值为。。。

根据C++标准草案第2.14.3节第1段所说,包含单个在执行字符集中可表示的c-char的普通字符字面值的类型为char。包含多个c-char的普通字符字面值为多字符字面值。多字符字面值或包含单个在执行字符集中不可表示的c-char的普通字符字面值是有条件支持的,类型为int,并且具有实现定义的值。

因此,av是多字符字面值,并且大小为int。

对于问题的第二部分,sizeof(main)不是有效的代码,尽管编译器可能仍然选择产生结果,但它将是实现定义的。根据C99标准草案第6.5.3.4节第1段所说,sizeof运算符不得应用于具有函数类型或不完全类型的表达式。

C++标准草案也有类似的措辞,而且gcc和clang在使用-pedantic标志时会发出此类代码的警告,错误如下所示:

警告:对函数类型的sizeof运算符的无效应用[-pedantic]

对于sizeof(main()),由于sizeof是一个编译时运算符,除了变长数组的情况外,它不会计算其参数的值。结果是返回类型的大小,这在本例中为int。例如,我们可以看到live example中的代码:

long double func()

{

return 1.0 ;

}

sizeof(func())返回16。

注意:

在您的平台上,sizeof(int)为4,但大小是实现定义的。

注意2:

由于sizeof的结果是size_t,printf的更可移植的格式说明符应为%zu。

0