亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么C和C ++支持在結構中成員分配數組,但一般不支持?

為什么C和C ++支持在結構中成員分配數組,但一般不支持?

C++ C
POPMUISE 2019-08-19 14:27:41
為什么C和C ++支持在結構中成員分配數組,但一般不支持?我理解不支持成員分配數組,因此以下方法不起作用:int num1[3] = {1,2,3};int num2[3];num2 = num1; // "error: invalid array assignment"我只是接受了這個事實,認為該語言的目的是提供一個開放式框架,并讓用戶決定如何實現諸如復制數組之類的東西。但是,以下工作正常:struct myStruct { int num[3]; };struct myStruct struct1 = {{1,2,3}};struct myStruct struct2;struct2 = struct1;該數組num[3]是從其實例中成員分配struct1到其實例中的struct2。為什么結構支持成員方式的數組,但一般情況下不支持?
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

關于賦值運算符,C ++標準如下(C ++03§5.17/ 1):

有幾個賦值運算符... 都需要一個可修改的左值作為它們的左操作數

數組不是可修改的左值。

但是,特別定義了對類類型對象的賦值(§5.17/ 4):

對類的對象的賦值由復制賦值運算符定義。

因此,我們期待看一個類的隱式聲明的復制賦值運算符(§12.8/ 13):

類X的隱式定義的復制賦值運算符執行其子對象的成員分配。...每個子對象都以適合其類型的方式分配:
... 
- 如果子對象是一個數組,則以適合于元素類型的方式分配每個元素
...

因此,對于類類型對象,可以正確復制數組。請注意,如果您提供用戶聲明的復制賦值運算符,則無法利用此操作,并且您必須逐個元素地復制數組。


推理在C(C99§6.5.16/ 2)中類似:

賦值運算符應具有可修改的左值作為其左操作數。

并且§6.3.2.1/ 1:

一個可修改的左值是一個沒有數組類型的左值... [其他約束如下]

在C中,賦值比C ++(§6.5.16.1/ 2)簡單得多:

在簡單賦值(=)中,右操作數的值將轉換為賦值表達式的類型,并替換存儲在左操作數指定的對象中的值。

對于struct-type對象的賦值,左右操作數必須具有相同的類型,因此右操作數的值只是復制到左操作數中。


查看完整回答
反對 回復 2019-08-19
  • 3 回答
  • 0 關注
  • 559 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號