c语言中,结构体能不能相加?
这个问题乍一看好像很简单,但是仔细一想,好像又没这么干过。
写个代码试下:
#include struct test{ int a; int b;};int main(){ struct test t1; struct test t2; t1 + t2; return 0;}
随便来个结构体,定义两个结构体变量,计算:t1 + t2;
的值。
编译代码,很显然,报错了:root@turbo:~# gcc 1.c -o 11.c: in function ‘main’:1.c:14:12: error: invalid operands to binary + (have ‘struct test’ and ‘struct test’) 14 | t1 + t2; | ^root@turbo:~#
所以结论就是:
c语言中的结构体不支持相加的操作。
原因也很简单,编译器不知道相加的规则:到底是 a 跟 a 相加还是 a 跟 b 相加。
要解决这个问题,可能只有函数能行。#include struct test{ int a; int b;};struct test func(struct test t1, struct test t2){ struct test t; t.a = t1.a + t2.a; t.b = t1.b + t2.b; return t;}int main(){ struct test t1; struct test t2; //t1 + t2; func(t1, t2); return 0;}
定义一个函数,参数是两个结构体变量,函数体相当于是你指定的规则,返回的结果也是一个结构体。
不过这个问题要是放在c++里面,那就真的不算问题。
因为c++有专门的机制来解决它,运算符重载,本质也是写个函数。test operator+(test t1, test t2) { test t; t.a = t1.a + t2.a; t.b = t1.b + t2.b; return t;} 函数名就叫:operator+。
operator是c++里面的关键字,专门用来给运算符赋予第二个含义。
函数的参数和返回值都是相同类型的结构体,函数体跟我们刚才写的也一样。
唯一不一样的地方,就是调用函数的时候,既可以通过函数名的形式:operator+(t1, t2); 也可以直接写成:t1 + t2; 这种形式,看起来更加人性化。
编译的时候选择c++的编译器g++,可以顺利通过:root@turbo:~# g++ test.cpp -o testroot@turbo:~#
当然了,我们在c++里面写代码,更多时候用的是class,成员变量给个私有属性,因为要在函数里面访问类的私有成员变量,所以把它声明成友元函数,这样看起来就顺眼的多。class test{private: int a; int b;public: test operator+(test t) { test tmp; tmp.a = this->a + t.a; tmp.b = this->b + t.b; return tmp; } };加法运算符不仅能重载友元函数,还能重载成成员函数。然后还会涉及构造函数、析构函数、this指针等等一大堆机制。所以,你觉得c语言和c++,哪个更复杂一些?
对话艾拉物联全球终端形象设计官 探寻划时代智慧空间2.0秘境
印刷电路板和自折叠机器人的应用
IEEE-SA修改会员收费方法,降低参与门槛
STM32F4时钟系统原理图解析
三星正在研发将OLED和量子点相结合的技术
C语言中结构体能不能相加
我国高效半导体照明材料关键技术获新进展
蔚来自研4D毫米波雷达的原理解析
中兴通讯率先推出业界首个虚实共管vBRAS解决方案
xilinx7系列FPGA的应用及功能解析——chiptuo(芯片拓展者)
一文了解充电器历史
小米MIX 3即将登陆欧洲市场 有望在12月1日开售
E资讯:华硕发布小屏旗舰Zenfone 9,起售价799欧元
vps和vpn有什么区别,哪个更适合跨境电商
想用一张报表满足多人需求?只需这3招,轻松实现0到100分新突破
ADI公司发布两款14位数模转换器
化肥成分检测仪的特点有哪些
瑞萨电子推出RA6T1 MCU,适用于电机控制及基于AI的端点预测性维护
Cortina Access业绩将可望出现5~10%的成长
福特中国正式公布 Mustang Mach-E 中国制造计划 全球首个高性能纯电动平台打造