struct s1 { int i: 8; int j: 4; int a: 3; double b; };

struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
输出答案:16, 24
 
1)只有64位的程序才会输出这样的输出结果;
2)在64位的程序中, int 的大小为8字节(64位);
3)struct s1中, 三个位域i, j, a连续定义,且8+4+3 = 15, 没有超过64位(一个int的位数),因此结构成员i, j, a共用一个int(8字节);
       double b 的大小为8字节。所以sizeof(s1) =8+8=16;
4)struct s2中,  二个连续的位域成员i, j共用1个int(8字节); 
             double b 是8字节;最后一个位域成员 a 占用一个int (8字节)。所以 sizeof(s2)=8+8+8=24;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好,关于代码的优化,以下是我给出的建议: 1. 定义结构体时,可以通过宏定义来指定成员变量的名称,增加代码的可读性和可维护性。例如: ```c #define NO no #define CHINESE chinese #define MATH math #define ENGLISH english #define AVERAGE average struct student { int NO; int CHINESE; int MATH; int ENGLISH; double AVERAGE; }; ``` 2. 在读入学生信息时,可以使用 `fgets` 函数读入一整行字符串,然后使用 `sscanf` 函数将其转换为需要的数据类型,这样可以避免因为输入格式错误而导致的问题。例如: ```c char line[100]; for (i = 0; i < n; i++) { fgets(line, sizeof(line), stdin); sscanf(line, "%d %d %d %d", &stu[i].NO, &stu[i].CHINESE, &stu[i].MATH, &stu[i].ENGLISH); stu[i].AVERAGE = (stu[i].CHINESE + stu[i].MATH + stu[i].ENGLISH) / 3.0; } ``` 3. 在进行排序时,可以使用 `const` 限定指针参数,提高函数的安全性和可读性。例如: ```c int cmp(const void *const a, const void *const b) { const struct student *const s1 = (const struct student *const)a; const struct student *const s2 = (const struct student *const)b; if (s1->AVERAGE != s2->AVERAGE) { return s2->AVERAGE > s1->AVERAGE ? 1 : -1; // 平均分不同,按照平均分从大到小排序 } else { return s1->NO - s2->NO; // 平均分相同,按照学号从小到大排序 } } ``` 基于以上建议,下面是优化后的代码: ```c #include <stdio.h> #include <stdlib.h> #define NO no #define CHINESE chinese #define MATH math #define ENGLISH english #define AVERAGE average struct student { int NO; int CHINESE; int MATH; int ENGLISH; double AVERAGE; }; int cmp(const void *const a, const void *const b) { const struct student *const s1 = (const struct student *const)a; const struct student *const s2 = (const struct student *const)b; if (s1->AVERAGE != s2->AVERAGE) { return s2->AVERAGE > s1->AVERAGE ? 1 : -1; // 平均分不同,按照平均分从大到小排序 } else { return s1->NO - s2->NO; // 平均分相同,按照学号从小到大排序 } } int main() { int n, i; scanf("%d", &n); getchar(); // 吸收换行符 struct student stu[n]; char line[100]; for (i = 0; i < n; i++) { fgets(line, sizeof(line), stdin); sscanf(line, "%d %d %d %d", &stu[i].NO, &stu[i].CHINESE, &stu[i].MATH, &stu[i].ENGLISH); stu[i].AVERAGE = (stu[i].CHINESE + stu[i].MATH + stu[i].ENGLISH) / 3.0; } qsort(stu, n, sizeof(struct student), cmp); // 调用qsort函数进行排序 for (i = 0; i < n; i++) { printf("%d %d %d %d\n", stu[i].NO, stu[i].CHINESE, stu[i].MATH, stu[i].ENGLISH); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值