小编Cbl*_*e X的帖子

如何在 C 中识别整数提升和降级?

我正在学习 C,整数提升和降级我来说是新的。我已经阅读了 C 标准(C17)中有关 C 类型转换和整数提升的内容,但我不知道如何识别整数提升,而且我对降级一无所知。

例如,如果我有这些代码行:

...
unsigned char x;
int y;
long int z;
int aux; //Auxiliary variable

x = 'c';
y = 1;
z = 2;

aux = x;
aux = y;
aux = z;

aux = x + y; // ZX
aux = y + z;
...
Run Code Online (Sandbox Code Playgroud)

哪里可以进行整数提升?因为据我所知,在用 注释的代码行中ZX,我有整数提升,但仅在那一行,但我不确定;你能为我澄清一下吗?

您能否举例说明何时存在降级?因为C标准没有明确。

c type-conversion integer-promotion

5
推荐指数
1
解决办法
366
查看次数

如何确保我将使用 C 标准库函数(如“getc”)的函数版本而不是类似函数的宏版本?

我正在学习 C 中的函数与类函数宏。

在阅读 C 标准时,我发现了这一点:

通过将函数名称括在括号中,可以在本地抑制函数的任何宏定义,因为该名称后面不会跟着指示宏函数名称扩展的左括号。出于相同的语法原因,允许获取库函数的地址,即使它也被定义为宏。185)使用#undef删除任何宏定义也将确保引用实际函数。

因此,根据此,如果我想确保 get 将是我的代码中的函数,我必须访问头<stdio.h>文件并将(我不知道是函数名称还是宏名称)括在括号或#undef宏中?

我的意思是这个:(int (getc)(FILE *stream);或者这个?#define (getc)(...) ) 或者这个: #undef getc

但这一切都在<stdio.h>文件里吗?

或者在我的代码里面?

你能给我一个关于如何确保getc在 C 中使用 as 函数的例子吗?

c macros function stdio getc

3
推荐指数
1
解决办法
102
查看次数

stdint.h 库中包含的整数类型是“扩展整数类型”吗?

我正在学习整数转换等级,但我有一个问题,我经常使用 stdint.h 库,并且我读到的有关“整数转换等级”的内容是:

“任何标准整数类型的等级应大于具有相同大小的任何扩展整数类型的等级。”

例如,据我所知,“int”是标准整数类型,但使用 stdint.hi 具有等于“int”的“int32_t”

我知道 stdint.h 库使用“typedef”,因此理论上 int 和 int32_t 是相等的,但我在论坛中读到“扩展整数类型”使用 (u)intxx_t 来引用

所以我的问题是,stdint.h 库中包含的“精确宽度整数”是“标准整数类型”还是被视为“扩展整数类型”?

感谢您的回答!

c types integer stdint

2
推荐指数
1
解决办法
74
查看次数

数据类型的长度是否取决于计算机的体系结构或您使用的编译器?

我之前读过几次,C 中数据类型的长度取决于 PC 上的体系结构。

但最近我阅读了编译器的文档,该文档指定了您可以访问的数据类型以及该数据类型的长度。

所以我的问题是,数据类型长度取决于您使用的编译器、计算机的体系结构或两者?

c types

1
推荐指数
1
解决办法
113
查看次数

在C语言中,C11前后如何使用“auto”关键字?

我读过有关自动变量和局部变量的内容;我知道我可以使用auto来声明局部变量,但我知道我只能在没有auto关键字的情况下声明/定义局部变量。

我读到,在C11之前,auto关键字是无用的,而在C11之后,auto关键字现在具有类型推断功能。

我使用 C99,我注意到这个版本的标准没有类型推断属性,因为如果我有这行代码:

...
auto x;
printf("%d",sizeof(x));
...

Run Code Online (Sandbox Code Playgroud)

输出始终为 (4),即使使用 1.5 初始化“x”也是如此。

我的问题是,auto关键字在C11之前有相关用途吗?

并且,在C11之后, auto关键字的“类型推断”属性有什么好处?在C11之后使用auto相关或重要的地方在哪里?

提前致谢!!

c type-inference auto

0
推荐指数
1
解决办法
878
查看次数