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 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 112.78.70.250 (台湾)
※ 文章网址: https://webptt.com/cn.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灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP