0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言中結(jié)構(gòu)體能不能相加

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2023-12-19 17:04 ? 次閱讀

C語(yǔ)言中,結(jié)構(gòu)體能不能相加?

這個(gè)問(wèn)題乍一看好像很簡(jiǎn)單,但是仔細(xì)一想,好像又沒(méi)這么干過(guò)。

寫(xiě)個(gè)代碼試下:

#include 


struct Test
{
    int a;
    int b;
};


int main()
{
    struct Test t1; 
    struct Test t2; 


    t1 + t2; 


    return 0;
}

隨便來(lái)個(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語(yǔ)言中的結(jié)構(gòu)體不支持相加的操作。

原因也很簡(jiǎn)單,編譯器不知道相加的規(guī)則:到底是 a 跟 a 相加還是 a 跟 b 相加。

9f6160dc-9e4c-11ee-8b88-92fbcf53809c.png ?

要解決這個(gè)問(wèn)題,可能只有函數(shù)能行。
#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;
}

定義一個(gè)函數(shù),參數(shù)是兩個(gè)結(jié)構(gòu)體變量,函數(shù)體相當(dāng)于是你指定的規(guī)則,返回的結(jié)果也是一個(gè)結(jié)構(gòu)體。

不過(guò)這個(gè)問(wèn)題要是放在C++里面,那就真的不算問(wèn)題。

因?yàn)镃++有專(zhuān)門(mén)的機(jī)制來(lái)解決它,運(yùn)算符重載,本質(zhì)也是寫(xiě)個(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)鍵字,專(zhuān)門(mén)用來(lái)給運(yùn)算符賦予第二個(gè)含義。

函數(shù)的參數(shù)和返回值都是相同類(lèi)型的結(jié)構(gòu)體,函數(shù)體跟我們剛才寫(xiě)的也一樣。

唯一不一樣的地方,就是調(diào)用函數(shù)的時(shí)候,既可以通過(guò)函數(shù)名的形式:
operator+(t1, t2);
也可以直接寫(xiě)成:
t1 + t2;
這種形式,看起來(lái)更加人性化。

編譯的時(shí)候選擇C++的編譯器g++,可以順利通過(guò):
root@turbo:~# g++ test.cpp -o test
root@turbo:~#

當(dāng)然了,我們?cè)贑++里面寫(xiě)代碼,更多時(shí)候用的是class,成員變量給個(gè)私有屬性,因?yàn)橐诤瘮?shù)里面訪問(wèn)類(lèi)的私有成員變量,所以把它聲明成友元函數(shù),這樣看起來(lái)就順眼的多。
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ī)制。所以,你覺(jué)得C語(yǔ)言和C++,哪個(gè)更復(fù)雜一些?

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136820
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62618
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73650
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49130
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    130

    瀏覽量

    10841

原文標(biāo)題:結(jié)構(gòu)體能不能相加?

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中for循環(huán)的用法和應(yīng)用 C語(yǔ)言中for循環(huán)與while循環(huán)的區(qū)別

    C語(yǔ)言中的循環(huán)結(jié)構(gòu)時(shí),for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
    發(fā)表于 08-18 16:33 ?3257次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>for循環(huán)與while循環(huán)的區(qū)別

    C語(yǔ)言中數(shù)組和結(jié)構(gòu)體的內(nèi)存表示和布局

    C語(yǔ)言中,數(shù)組和結(jié)構(gòu)體都可以代表一塊內(nèi)存,但為什么結(jié)構(gòu)體可以直接賦值,而數(shù)組不可以?這個(gè)問(wèn)題涉及到C語(yǔ)言
    發(fā)表于 08-28 10:54 ?1611次閱讀

    編程語(yǔ)言中一個(gè)奇怪的代碼結(jié)構(gòu)

    C語(yǔ)言C++等編程語(yǔ)言中,我們常常會(huì)遇到一個(gè)奇怪的代碼結(jié)構(gòu)。
    發(fā)表于 11-01 10:24 ?442次閱讀
    編程<b class='flag-5'>語(yǔ)言中</b>一個(gè)奇怪的代碼<b class='flag-5'>結(jié)構(gòu)</b>

    能不能C語(yǔ)言中像操作寄存器那樣直接操作一個(gè)字節(jié)的單獨(dú)一位呢

    。但是這種方法有一個(gè)缺點(diǎn),就是看起來(lái)不直觀,比如0x5C要想知道每一位的狀態(tài)還得換算一下,同時(shí)要操作某一個(gè)單獨(dú)位時(shí),還必須使用位操作運(yùn)算,比如位與、位或、異或。?? 如果熟悉單片機(jī)的就會(huì)想到,能不能C
    發(fā)表于 02-25 06:13

    電池能不能修復(fù)?

    電池能不能修復(fù)? 電池修復(fù)作為一個(gè)新生事物,許多人對(duì)它不了解,也有許多人對(duì)它一知半解。那么電池到底能不能修復(fù)呢?
    發(fā)表于 11-23 10:40 ?1095次閱讀

    光耦(TLP521-4)能不能轉(zhuǎn)換電壓?

    光耦(TLP521-4)能不能轉(zhuǎn)換電壓?
    發(fā)表于 05-31 11:15 ?4291次閱讀

    諧波治理到底能不能節(jié)電

    諧波治理到底能不能節(jié)電?”這是我們做電能質(zhì)量行業(yè)經(jīng)常會(huì)被問(wèn)到的一個(gè)問(wèn)題。隨著國(guó)家對(duì)節(jié)能減排項(xiàng)目的大力支持,有不少商業(yè)人士一擁而上加入到節(jié)能行業(yè),想要分得節(jié)能市場(chǎng)的一杯羹。那么,通過(guò)諧波治理到底能不能實(shí)現(xiàn)節(jié)能的效果呢?
    發(fā)表于 04-23 15:50 ?3573次閱讀

    大型輥壓機(jī)軸磨損能不能現(xiàn)場(chǎng)維修?

    大型輥壓機(jī)軸磨損能不能現(xiàn)場(chǎng)維修?
    發(fā)表于 06-23 15:35 ?1次下載

    指針能不能作為循環(huán)變量?

    指針能不能作為循環(huán)變量?
    的頭像 發(fā)表于 02-16 18:11 ?1040次閱讀

    物聯(lián)網(wǎng)流量卡到底能不能用?

    物聯(lián)網(wǎng)流量卡到底能不能用?
    的頭像 發(fā)表于 08-28 09:40 ?6325次閱讀
    物聯(lián)網(wǎng)流量卡到底<b class='flag-5'>能不能</b>用?

    c語(yǔ)言中順序結(jié)構(gòu)的基本流程

    的語(yǔ)句組成,這些語(yǔ)句用于完成特定的任務(wù)或操作。在C語(yǔ)言中,每個(gè)語(yǔ)句都以分號(hào)結(jié)束,多個(gè)語(yǔ)句可以用大括號(hào)括起來(lái)形成一個(gè)語(yǔ)句塊。在順序結(jié)構(gòu)中,每個(gè)語(yǔ)句都依次執(zhí)行,按照代碼的順序執(zhí)行,然后才會(huì)執(zhí)行下一條語(yǔ)句。 首先,我們
    的頭像 發(fā)表于 11-22 10:20 ?1026次閱讀

    C語(yǔ)言中,同一個(gè)函數(shù)能不能被定義兩次?

    稍微有點(diǎn)C語(yǔ)言基礎(chǔ)的同學(xué),一定知道不能這樣做。
    的頭像 發(fā)表于 05-11 18:27 ?1713次閱讀

    使用C語(yǔ)言實(shí)現(xiàn)函數(shù)模板

      用C語(yǔ)言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?387次閱讀

    C語(yǔ)言中的頭文件能不能重復(fù)包含

    C語(yǔ)言中的頭文件能不能重復(fù)包含? 比如代碼寫(xiě)成這樣,stdio.h 連續(xù)包含了兩次。 #include #include int main(){ printf("helloworld
    的頭像 發(fā)表于 11-26 17:19 ?162次閱讀

    C語(yǔ)言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放

    C語(yǔ)言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。 學(xué)過(guò) C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C
    的頭像 發(fā)表于 11-27 09:33 ?116次閱讀