C語言中,結(jié)構(gòu)體能不能相加?
這個(gè)問題乍一看好像很簡單,但是仔細(xì)一想,好像又沒這么干過。
寫個(gè)代碼試下:
#includestruct Test { int a; int b; }; int main() { struct Test t1; struct Test t2; t1 + t2; return 0; }
隨便來個(gè)結(jié)構(gòu)體,定義兩個(gè)結(jié)構(gòu)體變量,計(jì)算:
t1 + t2;
的值。
編譯代碼,很顯然,報(bào)錯(cuò)了:
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:~#
所以結(jié)論就是:
C語言中的結(jié)構(gòu)體不支持相加的操作。
原因也很簡單,編譯器不知道相加的規(guī)則:到底是 a 跟 a 相加還是 a 跟 b 相加。
![9f6160dc-9e4c-11ee-8b88-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/B6/BC/wKgaomWBXO2AWu0EAAiuWlzX5EI833.png)
要解決這個(gè)問題,可能只有函數(shù)能行。
#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; }
定義一個(gè)函數(shù),參數(shù)是兩個(gè)結(jié)構(gòu)體變量,函數(shù)體相當(dāng)于是你指定的規(guī)則,返回的結(jié)果也是一個(gè)結(jié)構(gòu)體。
不過這個(gè)問題要是放在C++里面,那就真的不算問題。
因?yàn)镃++有專門的機(jī)制來解決它,運(yùn)算符重載,本質(zhì)也是寫個(gè)函數(shù)。
Test operator+(Test t1, Test t2) { Test t; t.a = t1.a + t2.a; t.b = t1.b + t2.b; return t; }函數(shù)名就叫:operator+。
operator是C++里面的關(guān)鍵字,專門用來給運(yùn)算符賦予第二個(gè)含義。
函數(shù)的參數(shù)和返回值都是相同類型的結(jié)構(gòu)體,函數(shù)體跟我們剛才寫的也一樣。
唯一不一樣的地方,就是調(diào)用函數(shù)的時(shí)候,既可以通過函數(shù)名的形式:
operator+(t1, t2);也可以直接寫成:
t1 + t2;這種形式,看起來更加人性化。
編譯的時(shí)候選擇C++的編譯器g++,可以順利通過:
root@turbo:~# g++ test.cpp -o test root@turbo:~#
當(dāng)然了,我們在C++里面寫代碼,更多時(shí)候用的是class,成員變量給個(gè)私有屬性,因?yàn)橐诤瘮?shù)里面訪問類的私有成員變量,所以把它聲明成友元函數(shù),這樣看起來就順眼的多。
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; } };加法運(yùn)算符不僅能重載友元函數(shù),還能重載成成員函數(shù)。然后還會(huì)涉及構(gòu)造函數(shù)、析構(gòu)函數(shù)、this指針等等一大堆機(jī)制。所以,你覺得C語言和C++,哪個(gè)更復(fù)雜一些?
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137775 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62990 -
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73871 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49305 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10872
原文標(biāo)題:結(jié)構(gòu)體能不能相加?
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C語言中for循環(huán)的用法和應(yīng)用 C語言中for循環(huán)與while循環(huán)的區(qū)別
C語言中的循環(huán)結(jié)構(gòu)時(shí),for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
發(fā)表于 08-18 16:33
?3386次閱讀
![<b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)與while循環(huán)的區(qū)別](https://file1.elecfans.com/web2/M00/91/51/wKgaomTfLICAFadXAAAF1QHPifc502.jpg)
C語言中數(shù)組和結(jié)構(gòu)體的內(nèi)存表示和布局
C語言中,數(shù)組和結(jié)構(gòu)體都可以代表一塊內(nèi)存,但為什么結(jié)構(gòu)體可以直接賦值,而數(shù)組不可以?這個(gè)問題涉及到C語言
發(fā)表于 08-28 10:54
?1725次閱讀
編程語言中一個(gè)奇怪的代碼結(jié)構(gòu)
在C語言和C++等編程語言中,我們常常會(huì)遇到一個(gè)奇怪的代碼結(jié)構(gòu)。
發(fā)表于 11-01 10:24
?488次閱讀
![編程<b class='flag-5'>語言中</b>一個(gè)奇怪的代碼<b class='flag-5'>結(jié)構(gòu)</b>](https://file1.elecfans.com/web2/M00/AD/89/wKgZomVBtzWAKdoYAABYzrQ4IPk981.jpg)
能不能在C語言中像操作寄存器那樣直接操作一個(gè)字節(jié)的單獨(dú)一位呢
。但是這種方法有一個(gè)缺點(diǎn),就是看起來不直觀,比如0x5C要想知道每一位的狀態(tài)還得換算一下,同時(shí)要操作某一個(gè)單獨(dú)位時(shí),還必須使用位操作運(yùn)算,比如位與、位或、異或。?? 如果熟悉單片機(jī)的就會(huì)想到,能不能在C
發(fā)表于 02-25 06:13
電池能不能修復(fù)?
電池能不能修復(fù)?
電池修復(fù)作為一個(gè)新生事物,許多人對它不了解,也有許多人對它一知半解。那么電池到底能不能修復(fù)呢?
發(fā)表于 11-23 10:40
?1119次閱讀
諧波治理到底能不能節(jié)電
諧波治理到底能不能節(jié)電?”這是我們做電能質(zhì)量行業(yè)經(jīng)常會(huì)被問到的一個(gè)問題。隨著國家對節(jié)能減排項(xiàng)目的大力支持,有不少商業(yè)人士一擁而上加入到節(jié)能行業(yè),想要分得節(jié)能市場的一杯羹。那么,通過諧波治理到底能不能實(shí)現(xiàn)節(jié)能的效果呢?
發(fā)表于 04-23 15:50
?3665次閱讀
c語言中順序結(jié)構(gòu)的基本流程
的語句組成,這些語句用于完成特定的任務(wù)或操作。在C語言中,每個(gè)語句都以分號結(jié)束,多個(gè)語句可以用大括號括起來形成一個(gè)語句塊。在順序結(jié)構(gòu)中,每個(gè)語句都依次執(zhí)行,按照代碼的順序執(zhí)行,然后才會(huì)執(zhí)行下一條語句。 首先,我們
c語言中數(shù)組怎么定義
C語言中,數(shù)組是一種用來存儲相同類型元素的數(shù)據(jù)結(jié)構(gòu)。它可以存儲多個(gè)元素,并通過一個(gè)共同的名稱來引用這些元素。數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),可以用于解決很多實(shí)際的問題。 在
使用C語言實(shí)現(xiàn)函數(shù)模板
用C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
C語言中的頭文件能不能重復(fù)包含
C語言中的頭文件能不能重復(fù)包含? 比如代碼寫成這樣,stdio.h 連續(xù)包含了兩次。 #include #include int main(){ printf("helloworld
C語言中申請的堆內(nèi)存能不能自動(dòng)釋放
C語言中申請的堆內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。 學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C
評論