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++,哪個更復雜一些?
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7604瀏覽量
136813 -
函數
+關注
關注
3文章
4331瀏覽量
62610 -
C++
+關注
關注
22文章
2108瀏覽量
73646 -
編譯器
+關注
關注
1文章
1634瀏覽量
49129 -
結構體
+關注
關注
1文章
130瀏覽量
10841
原文標題:結構體能不能相加?
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
C語言中for循環的用法和應用 C語言中for循環與while循環的區別
C語言中的循環結構時,for循環是最常用的一種。它允許重復執行一段代碼,直到滿足特定條件為止。
發表于 08-18 16:33
?3254次閱讀
能不能在C語言中像操作寄存器那樣直接操作一個字節的單獨一位呢
。但是這種方法有一個缺點,就是看起來不直觀,比如0x5C要想知道每一位的狀態還得換算一下,同時要操作某一個單獨位時,還必須使用位操作運算,比如位與、位或、異或。?? 如果熟悉單片機的就會想到,能不能在C
發表于 02-25 06:13
諧波治理到底能不能節電
諧波治理到底能不能節電?”這是我們做電能質量行業經常會被問到的一個問題。隨著國家對節能減排項目的大力支持,有不少商業人士一擁而上加入到節能行業,想要分得節能市場的一杯羹。那么,通過諧波治理到底能不能實現節能的效果呢?
發表于 04-23 15:50
?3573次閱讀
c語言中順序結構的基本流程
的語句組成,這些語句用于完成特定的任務或操作。在C語言中,每個語句都以分號結束,多個語句可以用大括號括起來形成一個語句塊。在順序結構中,每個語句都依次執行,按照代碼的順序執行,然后才會執行下一條語句。 首先,我們
C語言中的頭文件能不能重復包含
C語言中的頭文件能不能重復包含? 比如代碼寫成這樣,stdio.h 連續包含了兩次。 #include #include int main(){ printf("helloworld
C語言中申請的堆內存能不能自動釋放
C語言中申請的堆內存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。 學過 C++ 的同學,應該首先能想到智能指針。 但是這是C
評論