我需要帮助解决这个问题在我脑海中,所以如果有人有类似的问题,它将对我很大的帮助。
任务是:下一段代码打印的内容:
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);我不明白为什么指纹是这样的:
01:2
02:2
03:1
04:41
05:65 在第一个打印函数中,我对为什么打印2的看法是,我们在联合中有两个char类型的数据。
在第二个函数中,它打印2,因为我们有两个char类型数组的元素。
在第三个函数中,它打印1,因为我们有一个char类型的数据。
在第四个函数中,它打印41,因为' A‘是在联合中的字符数据中输入的,而41是A的十六进制值。
我完全不明白打印的第五种功能,因为我不清楚三元操作符的情况。
有人能解释一下为什么打印结果是这样的吗?
发布于 2022-01-28 18:04:57
这里
union uni { char s[2], c; } u={"A"};定义了一个名为u的变量,其类型为在同一行中声明的联合类型。该变量还使用值"A“初始化,该值为2 chars的空终止序列。初始化的目标是第一个联合选项,一个包含两个元素的char数组。数组在索引0中接收'A',在索引1中接收'\0'。
这里
u.s[1] ? "05:%c":"05:%d"三元操作符用于检查数组的索引1(其中包含空终止符;布尔值为false)。因此,三元选择的选项是"05:%d",即整数解释的格式说明符。用于输出第二个联合选项。因此,输出的整数值为65,默认为十进制。
发布于 2022-01-28 18:01:28
printf("01:%d\n", sizeof(u));
01:2
u是一个包含两个成员的union类型:一个名为s的2元素char[]数组和一个名为c的char。union的所有成员都在内存中重叠,因此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'}初始化的。由于u是union,u.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只在其第一个操作数为非零的情况下计算它的第二个操作数,否则它计算它的第三个操作数。在本例中,您实际上是在执行以下操作:
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。
发布于 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。
https://stackoverflow.com/questions/70897976
复制相似问题