C语言结构体赋值类型不兼容错误排查及代码差异解析求助
C语言结构体赋值类型不匹配错误解析
我是一名编程初学者,完成作业时遇到问题。运行第一段C语言代码时出现如下编译错误,但第二段代码能正常运行,搞不懂两段的差异,恳请解析问题所在。
编译错误信息
Syntax Error(s) __tester__.c: In function ‘main’: __tester__.c:64:7: error: incompatible types when assigning to type ‘struct jatekok’ from type ‘float’ csere = tarsas[i].ertekeles; ^ __tester__.c:66:20: error: incompatible types when assigning to type ‘float’ from type ‘struct jatekok’ tarsas[j].ertekeles=csere;
第一段报错代码
#include <stdio.h> struct jatekok{ char nev[50]; int ev; float ertekeles; int min; int max; }csere; int main() { struct jatekok tarsas[8]; for(int i=0; i<8; i++) { scanf("%s %d %f %d %d", tarsas[i].nev, &tarsas[i].ev, &tarsas[i].ertekeles, &tarsas[i].min, &tarsas[i].max); } printf("A beolvasott adatok:\n"); for(int i=0; i<8; i++) { printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n", tarsas[i].nev, tarsas[i].ev, tarsas[i].ertekeles, tarsas[i].min, tarsas[i].max); } printf("\n"); printf("Az 5 fovel jatszhato jatekok:\n"); for(int i=0; i<8; i++) { if(tarsas[i].max>=5) { printf("%s\n", tarsas[i].nev); } } int regi=2040; int index =0; for(int i=0; i<8; i++) { if(tarsas[i].ev<regi) { regi=tarsas[i].ev; index=i; } } printf("\n"); printf("A legregebbi jatek: "); printf("%s\n", tarsas[index].nev); printf("\n"); printf("A rendezett jateklista:\n"); struct jatekok csere; for(int i=0;i<7;i++) for(int j=i+1;j<8;j++) if(tarsas[i].ertekeles<tarsas[j].ertekeles) { csere = tarsas[i].ertekeles; tarsas[i].ertekeles=tarsas[j].ertekeles; tarsas[j].ertekeles=csere; } for(int i=0; i<8; i++) { printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n", tarsas[i].nev, tarsas[i].ev, tarsas[i].ertekeles, tarsas[i].min, tarsas[i].max); } return 0; }
第二段可正常运行代码
#include <stdio.h> struct jatek{ char nev[50]; int ev; float ertekeles; int minjatekos; int maxjatekos; }; int main(){ struct jatek Jatekok[8]; printf("A beolvasott adatok:\n"); for (int i=0;i<8;i++){ scanf("%s %d %f %d %d",Jatekok[i].nev,&Jatekok[i].ev,&Jatekok[i].ertekeles, &Jatekok[i].minjatekos, &Jatekok[i].maxjatekos); printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n",Jatekok[i].nev,Jatekok[i].ev,Jatekok[i].ertekeles, Jatekok[i].minjatekos, Jatekok[i].maxjatekos);}; printf("\nAz 5 fovel jatszhato jatekok:\n"); for (int i=0;i<8;i++) if (Jatekok[i].maxjatekos>=5 && Jatekok[i].minjatekos <=5) printf("%s\n",Jatekok[i].nev); int minev = Jatekok[0].ev; for (int i=0;i<8;i++) if (Jatekok[i].ev<= minev) minev = Jatekok[i].ev; for (int i=0;i<8;i++) if (Jatekok[i].ev == minev){ printf("\nA legregebbi jatek: %s\n\nA rendezett jateklista:\n",Jatekok[i].nev); break;}; struct jatek temp; for (int i=0;i<7;i++) for (int j=i+1;j<8;j++) if (Jatekok[i].ertekeles < Jatekok[j].ertekeles){ temp = Jatekok[i]; Jatekok[i] = Jatekok[j]; Jatekok[j] = temp;}; for (int i=0;i<8;i++) printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n",Jatekok[i].nev,Jatekok[i].ev,Jatekok[i].ertekeles, Jatekok[i].minjatekos, Jatekok[i].maxjatekos); }
问题核心差异解析
两段代码的关键区别在排序逻辑的变量类型与赋值操作:
第一段代码的错误原因:
你在排序部分声明了struct jatekok csere;——这是一个完整的结构体变量,但你却试图用它存放float类型的tarsas[i].ertekeles(评分字段)。C语言不允许不同类型的变量直接赋值:csere = tarsas[i].ertekeles;:把float值赋值给结构体变量,类型不匹配tarsas[j].ertekeles=csere;:把结构体变量赋值给float字段,类型不匹配
这就是编译报错的直接原因。
第二段代码的正确逻辑:
排序部分声明了struct jatek temp;(同类型结构体变量),然后直接交换整个结构体实例:temp = Jatekok[i]; Jatekok[i] = Jatekok[j]; Jatekok[j] = temp;C语言允许同类型的结构体直接赋值,这样操作会把结构体的所有字段一起交换,既符合语法规则,也实现了按评分排序的需求。
额外提示:如果你的需求只是通过
ertekeles字段排序,但不想交换整个结构体,可以把csere声明为float类型,这样就能正确存放评分值来交换单个字段了。
内容的提问来源于stack exchange,提问作者carlostevez
相关产品推荐
相关产品推荐

