[問題] 用函數設定參照的問題

看板C_and_CPP (C/C++)作者 (佛仔)時間1年前 (2023/11/11 20:31), 編輯推噓3(3082)
留言85則, 6人參與, 1年前最新討論串1/2 (看更多)
各位晚安打擾了 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://www.ptt.cc/bbs/C_and_CPP/M.1699705889.A.42E.html

11/11 20:41, 1年前 , 1F
int assign to int reference 是合法的啊
11/11 20:41, 1F

11/11 20:43, 1年前 , 2F
這是左值和右值的問題 大部分function call回傳是右值
11/11 20:43, 2F

11/11 20:43, 1年前 , 3F
你這個版本的函式是回傳左值 所以可以被assign
11/11 20:43, 3F

11/11 20:58, 1年前 , 4F
你只是寫了a=5啊
11/11 20:58, 4F

11/11 21:00, 1年前 , 5F
你是說設值給std::function?通常是不行的
11/11 21:00, 5F

11/11 21:28, 1年前 , 6F
請問為什麼這個例子中回傳是左值呀?
11/11 21:28, 6F

11/11 21:29, 1年前 , 7F
回w大 是的 我是指f(a)=5這一行
11/11 21:29, 7F

11/11 22:28, 1年前 , 8F
這並不是給 function call 設值,是做完 function call
11/11 22:28, 8F

11/11 22:28, 1年前 , 9F
對 return value 設值,而這個 function return 的是
11/11 22:28, 9F

11/11 22:28, 1年前 , 10F
int&,所以式子是合法的
11/11 22:28, 10F

11/12 07:19, 1年前 , 11F
是只有return value是參照的情況下才能設值嗎?為什麼
11/12 07:19, 11F

11/12 07:19, 1年前 , 12F
呢?
11/12 07:19, 12F

11/12 10:19, 1年前 , 13F
你是設給returned ref而不是function 不要搞混了,f(a)
11/12 10:19, 13F

11/12 10:19, 1年前 , 14F
是呼叫function f並取得回傳的ref
11/12 10:19, 14F

11/12 10:20, 1年前 , 15F
給function設值是f = xxx,但是要看你想做什麼
11/12 10:20, 15F

11/12 10:34, 1年前 , 16F
為什麼回傳的是左值這個問題的答案在左值的定義中就能
11/12 10:34, 16F

11/12 10:35, 1年前 , 17F
找到
11/12 10:35, 17F

11/12 10:35, 1年前 , 18F
你會這樣問就代表你其實不懂什麼是左值 或者不懂什麼東
11/12 10:35, 18F

11/12 10:35, 1年前 , 19F
西會被分在左值 左右值的概念在網路上資源很多 你最好
11/12 10:35, 19F

11/12 10:35, 1年前 , 20F
找幾篇文章看一下 或是翻板上以前的文章也行 不然你大
11/12 10:35, 20F

11/12 10:35, 1年前 , 21F
概會繼續用很破碎的方式去理解
11/12 10:35, 21F

11/12 10:56, 1年前 , 22F
好的 謝謝您
11/12 10:56, 22F

11/12 11:25, 1年前 , 23F
恩...我前面的講法不太好,不要太糾結他是 return valu
11/12 11:25, 23F

11/12 11:25, 1年前 , 24F
e。一行程式碼不見得只做一件事,他可以有很多步驟,舉
11/12 11:25, 24F

11/12 11:25, 1年前 , 25F
例來說 a = b * c + d:
11/12 11:25, 25F

11/12 11:25, 1年前 , 26F
1. b * c,
11/12 11:25, 26F

11/12 11:25, 1年前 , 27F
2. b * c 的結果加上 d,
11/12 11:25, 27F

11/12 11:25, 1年前 , 28F
3. assign b * c + d 的結果給 a
11/12 11:25, 28F

11/12 11:25, 1年前 , 29F
不論是 = 左邊還是右邊都要分步驟做,然後要注意 a. 動
11/12 11:25, 29F

11/12 11:25, 1年前 , 30F
作、b. type
11/12 11:25, 30F

11/12 11:45, 1年前 , 31F
謝謝L大
11/12 11:45, 31F

11/12 11:49, 1年前 , 32F
想問一下那為什麼當傳回值是指標的時候f()也不能當左值
11/12 11:49, 32F

11/12 11:49, 1年前 , 33F
呢 指標在記憶體中有確切的位置,應該是可以當作左值的
11/12 11:49, 33F

11/12 11:49, 1年前 , 34F
不是嗎
11/12 11:49, 34F

11/12 12:13, 1年前 , 35F
指標指到的東西是左值 不代表指標本身會是左值
11/12 12:13, 35F

11/12 12:15, 1年前 , 36F

11/12 12:33, 1年前 , 37F
喔喔了解了 謝謝
11/12 12:33, 37F

11/12 12:47, 1年前 , 38F
有些東西搞混了 感謝各位
11/12 12:47, 38F

11/14 13:36, 1年前 , 39F
這裡提供另一個角度 即使不用左值右值的概念 你可以
11/14 13:36, 39F

11/14 13:36, 1年前 , 40F
把所有參照都想成該變數的指標
11/14 13:36, 40F

11/14 13:37, 1年前 , 41F
當一個變數是參照時 你把她換成是原變數的指標 然
11/14 13:37, 41F

11/14 13:37, 1年前 , 42F
後使用時加上*取值
11/14 13:37, 42F

11/14 13:38, 1年前 , 43F
實際上編譯器就是把參照編譯成指標
11/14 13:38, 43F

11/14 13:38, 1年前 , 44F
所以你可以改成 int *f(int *)
11/14 13:38, 44F

11/14 13:39, 1年前 , 45F
然後使用時 *f(a)=0
11/14 13:39, 45F

11/14 13:39, 1年前 , 46F
實際上是一模一樣的東西
11/14 13:39, 46F

11/14 13:40, 1年前 , 47F
其實參照就是指標的語法糖而已 我覺得要搞清楚這點
11/14 13:40, 47F

11/14 13:40, 1年前 , 48F
再去學左值右值的概念
11/14 13:40, 48F

11/14 15:16, 1年前 , 49F
c++ declaration用法跟其他地方用法不一樣很容易搞混
11/14 15:16, 49F

11/14 16:35, 1年前 , 50F
請問q大的意思是這樣嗎
11/14 16:35, 50F

11/14 16:35, 1年前 , 51F
int* f(int* );
11/14 16:35, 51F

11/14 16:35, 1年前 , 52F
int main()
11/14 16:35, 52F

11/14 16:35, 1年前 , 53F
{
11/14 16:35, 53F

11/14 16:35, 1年前 , 54F
int a=1;
11/14 16:35, 54F

11/14 16:35, 1年前 , 55F
int* p=&a;
11/14 16:35, 55F

11/14 16:35, 1年前 , 56F
*f(p)=5;
11/14 16:35, 56F

11/14 16:35, 1年前 , 57F
cout<<a;
11/14 16:35, 57F

11/14 16:35, 1年前 , 58F
return 0;
11/14 16:35, 58F

11/14 16:35, 1年前 , 59F
}
11/14 16:35, 59F

11/14 16:35, 1年前 , 60F
int* f(int* x){
11/14 16:35, 60F

11/14 16:35, 1年前 , 61F
return x;
11/14 16:35, 61F

11/14 16:35, 1年前 , 62F
}
11/14 16:35, 62F

11/14 16:38, 1年前 , 63F
請問編譯器把參照編譯成指標是什麼意思呀
11/14 16:38, 63F

11/14 20:11, 1年前 , 64F
C 的世界裡是只有 pointer 的,到了 C++ 雖然多了 refe
11/14 20:11, 64F

11/14 20:11, 1年前 , 65F
rence,但其實底層實現本質上還是個 pointer,只是多了
11/14 20:11, 65F

11/14 20:11, 1年前 , 66F
些語法上的方便性。
11/14 20:11, 66F

11/14 20:11, 1年前 , 67F
像是用 reference 的好處是寫的時候不用加 * 去存取 va
11/14 20:11, 67F

11/14 20:11, 1年前 , 68F
lue,並且一定 reference 的到值,不需要去檢查 nullpt
11/14 20:11, 68F

11/14 20:11, 1年前 , 69F
r (畢竟要有 object 你才拿得到 reference 嘛)。
11/14 20:11, 69F

11/14 20:14, 1年前 , 70F
前面 qwer 講的理解方式適合從 C 入門 C++ 的人去理解
11/14 20:14, 70F

11/14 20:14, 1年前 , 71F
reference,不過如果直接就學 C++ 的話,沒必要這樣轉
11/14 20:14, 71F

11/14 20:14, 1年前 , 72F
一手去理解,關注在 "type" 本身就好
11/14 20:14, 72F

11/14 20:17, 1年前 , 73F
至於左值、右值嘛...其實也不是說一定要搞懂吧,反正記
11/14 20:17, 73F

11/14 20:17, 1年前 , 74F
著想確保是用 move 的時候用 std::move,想 forward 參
11/14 20:17, 74F

11/14 20:17, 1年前 , 75F
數就用 std::forward,就像不會微積分也能在菜市場買菜
11/14 20:17, 75F

11/14 20:17, 1年前 , 76F
一樣,搞不清楚左值右值還是能寫 code
11/14 20:17, 76F

11/14 22:58, 1年前 , 77F
其實我當年也是從c++直接開始的啦 只是學完取值取址
11/14 22:58, 77F

11/14 22:58, 1年前 , 78F
之後 對於ref 還是有點迷惑 直到認知到他就是指標
11/14 22:58, 78F

11/14 22:58, 1年前 , 79F
之後才豁然開朗。 實際上我常常去看什麼code會編譯
11/14 22:58, 79F

11/14 22:58, 1年前 , 80F
出什麼組語, ref 跟pointer 會編譯出一模一樣的東
11/14 22:58, 80F

11/14 22:58, 1年前 , 81F
西
11/14 22:58, 81F

11/14 23:03, 1年前 , 82F
回原po 編譯成指標的意思 就是他們底層實現的原理
11/14 23:03, 82F

11/14 23:03, 1年前 , 83F
相同 本質上你寫語言其實都是在對硬體做一些操作
11/14 23:03, 83F

11/14 23:03, 1年前 , 84F
而指標與參照做的操作是一樣的
11/14 23:03, 84F

11/15 07:47, 1年前 , 85F
好的 感謝L大和q大!
11/15 07:47, 85F
文章代碼(AID): #1bJtGXGk (C_and_CPP)
文章代碼(AID): #1bJtGXGk (C_and_CPP)