C_and_CPP 板


LINE

各位晚安打擾了 https://onlinegdb.com/_DyNuxd2H 我一直不太明白為什麼為什麼這樣寫是合法的 f(a)=5這行不是在把function call設值嗎 但是照理來說只能assign value給變數吧?(gpt這樣跟我講的,但是他又說我的例子不是 設值給f(a)@@) 不好意思我好像越問越基本了...謝謝大家 ---- Sent from BePTT on my OPPO CPH1943 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.78.70.250 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1699705889.A.42E.html
1F:→ nh60211as: int assign to int reference 是合法的啊 11/11 20:41
2F:→ sarafciel: 這是左值和右值的問題 大部分function call回傳是右值 11/11 20:43
3F:→ sarafciel: 你這個版本的函式是回傳左值 所以可以被assign 11/11 20:43
4F:→ wulouise: 你只是寫了a=5啊 11/11 20:58
5F:→ wulouise: 你是說設值給std::function?通常是不行的 11/11 21:00
6F:→ amamoimi: 請問為什麼這個例子中回傳是左值呀? 11/11 21:28
7F:→ amamoimi: 回w大 是的 我是指f(a)=5這一行 11/11 21:29
8F:→ Lipraxde: 這並不是給 function call 設值,是做完 function call 11/11 22:28
9F:→ Lipraxde: 對 return value 設值,而這個 function return 的是 11/11 22:28
10F:→ Lipraxde: int&,所以式子是合法的 11/11 22:28
11F:→ amamoimi: 是只有return value是參照的情況下才能設值嗎?為什麼 11/12 07:19
12F:→ amamoimi: 呢? 11/12 07:19
13F:→ wulouise: 你是設給returned ref而不是function 不要搞混了,f(a) 11/12 10:19
14F:→ wulouise: 是呼叫function f並取得回傳的ref 11/12 10:19
15F:→ wulouise: 給function設值是f = xxx,但是要看你想做什麼 11/12 10:20
16F:→ sarafciel: 為什麼回傳的是左值這個問題的答案在左值的定義中就能 11/12 10:34
17F:→ sarafciel: 找到 11/12 10:35
18F:→ sarafciel: 你會這樣問就代表你其實不懂什麼是左值 或者不懂什麼東 11/12 10:35
19F:→ sarafciel: 西會被分在左值 左右值的概念在網路上資源很多 你最好 11/12 10:35
20F:→ sarafciel: 找幾篇文章看一下 或是翻板上以前的文章也行 不然你大 11/12 10:35
21F:→ sarafciel: 概會繼續用很破碎的方式去理解 11/12 10:35
22F:→ amamoimi: 好的 謝謝您 11/12 10:56
23F:→ Lipraxde: 恩...我前面的講法不太好,不要太糾結他是 return valu 11/12 11:25
24F:→ Lipraxde: e。一行程式碼不見得只做一件事,他可以有很多步驟,舉 11/12 11:25
25F:→ Lipraxde: 例來說 a = b * c + d: 11/12 11:25
26F:→ Lipraxde: 1. b * c, 11/12 11:25
27F:→ Lipraxde: 2. b * c 的結果加上 d, 11/12 11:25
28F:→ Lipraxde: 3. assign b * c + d 的結果給 a 11/12 11:25
29F:→ Lipraxde: 不論是 = 左邊還是右邊都要分步驟做,然後要注意 a. 動 11/12 11:25
30F:→ Lipraxde: 作、b. type 11/12 11:25
31F:→ amamoimi: 謝謝L大 11/12 11:45
32F:→ amamoimi: 想問一下那為什麼當傳回值是指標的時候f()也不能當左值 11/12 11:49
33F:→ amamoimi: 呢 指標在記憶體中有確切的位置,應該是可以當作左值的 11/12 11:49
34F:→ amamoimi: 不是嗎 11/12 11:49
35F:→ sarafciel: 指標指到的東西是左值 不代表指標本身會是左值 11/12 12:13
36F:→ sarafciel: https://godbolt.org/z/68M1Wxjx1 11/12 12:15
37F:→ amamoimi: 喔喔了解了 謝謝 11/12 12:33
38F:→ amamoimi: 有些東西搞混了 感謝各位 11/12 12:47
39F:推 qwerasdf6102: 這裡提供另一個角度 即使不用左值右值的概念 你可以 11/14 13:36
40F:→ qwerasdf6102: 把所有參照都想成該變數的指標 11/14 13:36
41F:→ qwerasdf6102: 當一個變數是參照時 你把她換成是原變數的指標 然 11/14 13:37
42F:→ qwerasdf6102: 後使用時加上*取值 11/14 13:37
43F:→ qwerasdf6102: 實際上編譯器就是把參照編譯成指標 11/14 13:38
44F:→ qwerasdf6102: 所以你可以改成 int *f(int *) 11/14 13:38
45F:→ qwerasdf6102: 然後使用時 *f(a)=0 11/14 13:39
46F:→ qwerasdf6102: 實際上是一模一樣的東西 11/14 13:39
47F:→ qwerasdf6102: 其實參照就是指標的語法糖而已 我覺得要搞清楚這點 11/14 13:40
48F:→ qwerasdf6102: 再去學左值右值的概念 11/14 13:40
49F:→ wulouise: c++ declaration用法跟其他地方用法不一樣很容易搞混 11/14 15:16
50F:→ amamoimi: 請問q大的意思是這樣嗎 11/14 16:35
51F:→ amamoimi: int* f(int* ); 11/14 16:35
52F:→ amamoimi: int main() 11/14 16:35
53F:→ amamoimi: { 11/14 16:35
54F:→ amamoimi: int a=1; 11/14 16:35
55F:→ amamoimi: int* p=&a; 11/14 16:35
56F:→ amamoimi: *f(p)=5; 11/14 16:35
57F:→ amamoimi: cout<<a; 11/14 16:35
58F:→ amamoimi: return 0; 11/14 16:35
59F:→ amamoimi: } 11/14 16:35
60F:→ amamoimi: int* f(int* x){ 11/14 16:35
61F:→ amamoimi: return x; 11/14 16:35
62F:→ amamoimi: } 11/14 16:35
63F:→ amamoimi: 請問編譯器把參照編譯成指標是什麼意思呀 11/14 16:38
64F:→ Lipraxde: C 的世界裡是只有 pointer 的,到了 C++ 雖然多了 refe 11/14 20:11
65F:→ Lipraxde: rence,但其實底層實現本質上還是個 pointer,只是多了 11/14 20:11
66F:→ Lipraxde: 些語法上的方便性。 11/14 20:11
67F:→ Lipraxde: 像是用 reference 的好處是寫的時候不用加 * 去存取 va 11/14 20:11
68F:→ Lipraxde: lue,並且一定 reference 的到值,不需要去檢查 nullpt 11/14 20:11
69F:→ Lipraxde: r (畢竟要有 object 你才拿得到 reference 嘛)。 11/14 20:11
70F:→ Lipraxde: 前面 qwer 講的理解方式適合從 C 入門 C++ 的人去理解 11/14 20:14
71F:→ Lipraxde: reference,不過如果直接就學 C++ 的話,沒必要這樣轉 11/14 20:14
72F:→ Lipraxde: 一手去理解,關注在 "type" 本身就好 11/14 20:14
73F:→ Lipraxde: 至於左值、右值嘛...其實也不是說一定要搞懂吧,反正記 11/14 20:17
74F:→ Lipraxde: 著想確保是用 move 的時候用 std::move,想 forward 參 11/14 20:17
75F:→ Lipraxde: 數就用 std::forward,就像不會微積分也能在菜市場買菜 11/14 20:17
76F:→ Lipraxde: 一樣,搞不清楚左值右值還是能寫 code 11/14 20:17
77F:推 qwerasdf6102: 其實我當年也是從c++直接開始的啦 只是學完取值取址 11/14 22:58
78F:→ qwerasdf6102: 之後 對於ref 還是有點迷惑 直到認知到他就是指標 11/14 22:58
79F:→ qwerasdf6102: 之後才豁然開朗。 實際上我常常去看什麼code會編譯 11/14 22:58
80F:→ qwerasdf6102: 出什麼組語, ref 跟pointer 會編譯出一模一樣的東 11/14 22:58
81F:→ qwerasdf6102: 西 11/14 22:58
82F:推 qwerasdf6102: 回原po 編譯成指標的意思 就是他們底層實現的原理 11/14 23:03
83F:→ qwerasdf6102: 相同 本質上你寫語言其實都是在對硬體做一些操作 11/14 23:03
84F:→ qwerasdf6102: 而指標與參照做的操作是一樣的 11/14 23:03
85F:→ amamoimi: 好的 感謝L大和q大! 11/15 07:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP