首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印操作符

打印操作符
EN

Stack Overflow用户
提问于 2022-01-28 17:40:33
回答 4查看 155关注 0票数 0

我需要帮助解决这个问题在我脑海中,所以如果有人有类似的问题,它将对我很大的帮助。

任务是:下一段代码打印的内容:

代码语言:javascript
复制
union uni { char s[2], c; } u={"A"};
printf("01:%d\n", sizeof(u));
printf("02:%d\n", sizeof(u.s));
printf("03:%d\n", sizeof(u.c));
printf("04:%x\n", u.c);
printf(u.s[1] ? "05:%c":"05:%d", u.c);

我不明白为什么指纹是这样的:

代码语言:javascript
复制
01:2
02:2
03:1
04:41
05:65 

在第一个打印函数中,我对为什么打印2的看法是,我们在联合中有两个char类型的数据。

在第二个函数中,它打印2,因为我们有两个char类型数组的元素。

在第三个函数中,它打印1,因为我们有一个char类型的数据。

在第四个函数中,它打印41,因为' A‘是在联合中的字符数据中输入的,而41是A的十六进制值。

我完全不明白打印的第五种功能,因为我不清楚三元操作符的情况。

有人能解释一下为什么打印结果是这样的吗?

EN

回答 4

Stack Overflow用户

发布于 2022-01-28 18:04:57

这里

代码语言:javascript
复制
union uni { char s[2], c; } u={"A"};

定义了一个名为u的变量,其类型为在同一行中声明的联合类型。该变量还使用值"A“初始化,该值为2 chars的空终止序列。初始化的目标是第一个联合选项,一个包含两个元素的char数组。数组在索引0中接收'A',在索引1中接收'\0'

这里

代码语言:javascript
复制
u.s[1] ? "05:%c":"05:%d"

三元操作符用于检查数组的索引1(其中包含空终止符;布尔值为false)。因此,三元选择的选项是"05:%d",即整数解释的格式说明符。用于输出第二个联合选项。因此,输出的整数值为65,默认为十进制。

票数 2
EN

Stack Overflow用户

发布于 2022-01-28 18:01:28

printf("01:%d\n", sizeof(u));

01:2

u是一个包含两个成员的union类型:一个名为s的2元素char[]数组和一个名为ccharunion的所有成员都在内存中重叠,因此union的大小就是其最大成员的大小,在本例中是s。由于sizeof(char)为1,s的大小为sizeof(char) * 2 = 2,因此union的大小为2。

printf("02:%d\n", sizeof(u.s));

02:2

s是一个char[2]数组,所以它的大小是sizeof(char) * 2 = 2

printf("03:%d\n", sizeof(u.c));

03:1

c是一个单一的char,所以它的大小是sizeof(char) = 1

printf("04:%x\n", u.c);

04:41

您正在使用字符串文本u初始化"A"。初始化一个union将初始化它的第一个成员(除非使用指定的初始化器,而不是这样做)。因此,u.s是用{'A', '\0'}初始化的。由于uunionu.c与内存中u.s的第一个数组元素重叠,因此u.c现在包含字符'A',该字符的ASCII十进制值为65。您告诉printf()u.c的值打印为十六进制整数,而十六进制值65为0x41。

printf(u.s[1] ? "05:%c":"05:%d", u.c);

05:65

?: conditional operator只在其第一个操作数为非零的情况下计算它的第二个操作数,否则它计算它的第三个操作数。在本例中,您实际上是在执行以下操作:

代码语言:javascript
复制
const char* fmt;
if (u.s[1] != 0)
    fmt = "05:%c";
else
    fmt = "05:%d";
printf(fmt, u.c);

如前所述,u.s[1]是用字符'\0'初始化的,字符'\0'的数值为0。由于?:的第一个操作数为0,因此计算第三个操作数,即"05:%d"。因此,您告诉printf()u.c的值打印为十进制整数,而不是字符。正如前面所述,u.c包含字符'A',它的小数值为65。

票数 1
EN

Stack Overflow用户

发布于 2022-01-28 17:55:33

请记住,union一次只能存储一个成员,因此只为最大的成员留出足够的空间--在本例中,这是成员s,它是char的一个2元素数组。

因此,对象u必须至少与u.s一样大,后者是char的两个元素数组,因此是sizeof u == sizeof u.s == 2

成员u.c的类型是char,所以是sizeof u.c == 1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70897976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档