关于结构体输出的问题,如何解决?

这个的输出,为什么第二行是7,3?


struct {
  int a; int *b;
} s[4], *p;
int i, n = 1;    
for(i = 0; i < 4; i++){
      s[i].a = n;
      s[i].b = &s[i].a;
      n = n + 2;
}
p = &s[0];
printf("%d\n", ++*p->b);
p++;
printf("%d,%d\n", (++p)->a, (p++)->a);  /* 输出数据之间没有空格分隔;按从右向左的顺序求解表达式 */

函数的参数求值顺序,是C语言的未定义行为,各个编译器输出的结果都不一定

img


这里是 5,5

img


这里是 7,3

注意,我选不同的编译器,它结果都不一样。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7616706
  • 你也可以参考下这篇文章:定义二叉树结点,创建二叉树,分别利用先序非递归算法、输出结果。
  • 除此之外, 这篇博客: 对结构体元素进行排序中的 知识点二:结构体排序 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 俗话说工欲善其事必先利其器,知道了sort的原理,我们就可以进行排序了,当然也可以自己设计排序规则,而且结构体可以直接进行赋值,也很方便。

    如果想通过sort进行排序,那么就需要知道如何设计排序规则,假设我们有三个变量来描述一个学生,如果名字一样,就通过年龄排序,如果年龄也相同,就通过成绩来排序,默认的顺序都是从小到大的顺序进行排序。

    于是首先设计结构体student:

    struct student{
        string name;    //姓名
        int age;        //年龄
        int grade;      //成绩
    };

    第二个问题,也是难点,设计排序规则,那么就需要了解sort的实现原理。在自己的设计规则中,引用的两个串不希望改变它们的值所以设计为const引用,然后考虑具体的规则:默认排序是按照从小到大的顺序进行排序,所以如果两个对象的name不相等,那么就返回s1.name < s2.name ,这是对于name 不相等的情况,对于name相等,我们还需要考虑age相不相等,如果不考虑,默认是按照数组中的原本顺序排列的,不会做排序处理。

    int comp(const student &s1,const student &s2){
        if(s1.name == s2.name && s1.age != s2.age){
            return s1.age < s2.age;
        }
        else if(s1.name == s2.name && s1.age == s2.age){
            return s1.grade < s2.grade;
        }
        else{
            return s1.name < s2.name;
        }
    }

    测试代码:

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    //按姓名从小到大排序,姓名一样,按年龄从小到大排序
    struct student{
        string name;    //姓名
        int age;        //年龄
        int grade;      //成绩
    };
    
    //自己定义的排序规则
    int comp(const student &s1,const student &s2){
        if(s1.name == s2.name && s1.age != s2.age){
            return s1.age < s2.age;
        }
        else if(s1.name == s2.name && s1.age == s2.age){
            return s1.grade < s2.grade;
        }
        else{
            return s1.name < s2.name;
        }
    }
    
    int main(){
        student s[100];
        s[0].name = "zhangsan"; s[0].age = 19; s[0].grade = 20;
        s[1].name = "zhangsan"; s[1].age = 18; s[1].grade = 20;
        s[2].name = "lisi";     s[2].age = 20; s[2].grade = 20;
        s[3].name = "zhangsan"; s[3].age = 19; s[3].grade = 2;
        s[4].name = "zhangsan"; s[4].age = 17; s[4].grade = 20;
        s[5].name = "lisi";     s[5].age = 20; s[5].grade = 15;
        sort(s, s + 6, comp);       //左闭右开,所以是对s[0]到s[6]排序
    
        for(int i = 0; i < 6; i++){
            cout<<s[i].name<<" "<<s[i].age<<" "<<s[i].grade<<endl;
        }
    
        return 0;
    }
    

     

  • 您还可以看一下 刘欢老师的从前端到后台,开发一个完整功能的小程序课程中的 搭建与设置服务器域名小节, 巩固相关知识点