C语言中,结构体能不能相加?
这个问题乍一看好像很简单,但是仔细一想,好像又没这么干过。
写个代码试下:
#includestruct 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 1 1.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 相加。
要解决这个问题,可能只有函数能行。
#includestruct 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 test root@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++,哪个更复杂一些?
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
- C语言
+关注
关注
180文章
7561浏览量
133282 - 函数
+关注
关注
3文章
4214浏览量
61851 - C++
+关注
关注
21文章
2084浏览量
73225 - 编译器
+关注
关注
1文章
1594浏览量
48862 - 结构体
+关注
关注
1文章
126浏览量
10797
原文标题:结构体能不能相加?
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先登录
相关推荐
C语言中for循环的用法和应用C语言中for循环与while循环的区别
C
语言中的循环
结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
发表于08-18 16:33
•
2156次阅读
C语言中数组和结构体的内存表示和布局
C
语言中,数组和
结构体都可以代表一块内存,但为什么
结构体可以直接赋值,而数组不可以?这个问题涉及到
C
语言
发表于08-28 10:54
•
999次阅读
如何在C语言中把结构体定义为常量?
结构体是只读的(
不能改变
结构体变量的值),此时,
结构体的所有成员也是只读的不知道
能不能用但是const不是绝对安全的大家发表一下意见啊~~应
发表于10-24 04:37
能不能在C语言中像操作寄存器那样直接操作一个字节的单独一位呢
。但是这种方法有一个缺点,就是看起来不直观,比如0x5
C要想知道每一位的状态还得换算一下,同时要操作某一个单独位时,还必须使用位操作运算,比如位与、位或、异或。 如果熟悉单片机的就会想到,
能不能在
C
发表于02-25 06:13
谐波治理到底能不能节电
谐波治理到底
能不能节电?”这是我们做电能质量行业经常会被问到的一个问题。随着国家对节能减排项目的大力支持,有不少商业人士一拥而上加入到节能行业,想要分得节能市场的一杯羹。那么,通过谐波治理到底
能不能实现节能的效果呢?
发表于04-23 15:50
•
3236次阅读
c语言中顺序结构的基本流程
的语句组成,这些语句用于完成特定的任务或操作。在
C
语言中,每个语句都以分号结束,多个语句可以用大括号括起来形成一个语句块。在顺序
结构中,每个语句都依次执行,按照代码的顺序执行,然后才会执行下一条语句。 首先,我们
c语言中数组怎么定义
C
语言中,数组是一种用来存储相同类型元素的数据
结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据
结构,可以用于解决很多实际的问题。 在
评论