作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] 不确定教科书上的内文是否被解读正确
时间Thu Mar 1 11:58:42 2018
图片:
https://imgur.com/a/gyTea
在Software Engineering Observation 7.2
我的解读是,如果一个calling function有两个argument a,b:
result = func(a,b);
那麽如果这个function的prototype是这样
int func(int a, int b);
那在implementation的部分,就只允许a或b的值被更改(两个不能同时被更改),而且被更
改的那个值一定要被return回去(我觉得我这句解读错误)
如果要同时更改a与b,必须把prototype改成这样
int func(int *a, int *b);
请问各位大大你们的理解是怎麽样呢?? 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.26.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1519876725.A.882.html
1F:→ Hazukashiine: 两个不能同时被更改? 03/01 12:00
2F:推 steve1012: 这句话要配例子看才有意思 03/01 12:21
3F:→ steve1012: 假设你有两个 变数 a,b 你想call一个 function 来改 a 03/01 12:22
4F:→ steve1012: b的话 用 clla by reference可以直接在 function 里 03/01 12:22
5F:→ steve1012: 面改他们的值 03/01 12:22
6F:→ steve1012: 但是你要是想用回传值改的话 因为只回传一个 int 你只 03/01 12:23
7F:→ steve1012: 能改一个值 03/01 12:23
喔喔~我听懂了 反正作者只是想表达用by value只能改a b其中一个,比如
a = func(a, b);
用by refernece则可以改一个以上
8F:→ Lipraxde: 怎麽感觉你一直在计较些小地方啊 03/01 13:04
听大家说这本书是圣经,所以我想要了解作者想表达的意思@@
※ 编辑: zzss2003 (60.248.26.157), 03/01/2018 13:15:26
9F:→ MOONRAKER: 圣经就是大家都会说要看 但是通常不看 最好不用自己看 03/01 13:37
10F:→ MOONRAKER: 再说一次你这样读书效率只会差不会好 03/01 13:37
11F:→ MOONRAKER: 依照早期经验 效果也很可疑 03/01 13:38
那M大您有什麽建议吗~
※ 编辑: zzss2003 (60.248.26.157), 03/01/2018 13:48:02
12F:推 rodion: 上面的解读我看起来不太正确... 03/01 16:33
13F:→ rodion: 我的解读:即使C function是call-by-value(copy),某些情形 03/01 16:34
14F:→ rodion: 依旧不适合在called function中更改argument值,作者举例 03/01 16:35
15F:→ rodion: array的ptr及size就属於这类型argument 03/01 16:36
16F:→ rodion: 不好意思没看清楚原PO问的是7.2 03/01 16:39
17F:→ rodion: 7.2我的解读是作者想说的只是call-by-value的argument仅仅 03/01 16:40
18F:→ rodion: 能在作为function return value的接收端被更改 (个人感觉 03/01 16:41
19F:→ rodion: 这样的说法不能说是错,但有点没必要,任何变数都能做为=的 03/01 16:43
20F:→ rodion: lhs而被更改,不是吗) 03/01 16:43
21F:→ phishingphi: 太钻牛角尖的念书方法了。单从这段话来说他只是再说 03/02 00:35
22F:→ phishingphi: 个例子然後带出 7.3 而已。 03/02 00:35
23F:→ phishingphi: 如果想把 array 内的值打印出来,那怎麽会有人去改 03/02 00:36
24F:→ phishingphi: caller 传给你的资讯? 起点和多少个元素都是 caller 03/02 00:36
25F:→ phishingphi: 跟你说的。 03/02 00:37
26F:→ phishingphi: pass-by-value 的 signature 你宣告成 const 意义不 03/02 00:38
27F:→ phishingphi: 大,我就复制一份给你这个函数去玩,你想怎麽改就怎 03/02 00:39
28F:→ phishingphi: 麽改,只要想想你这个函数要干嘛就好了。 03/02 00:39
29F:→ phishingphi: 话说回来就是 7.3 是说把某些不该被改到的东西定成 03/02 00:41
30F:→ phishingphi: const 然後 compiler 就能帮你检查是不是手残或眼拙 03/02 00:42
31F:→ phishingphi: 而不小心改到一些不该改的值。 03/02 00:42
32F:→ phishingphi: 小结:黄色框起来的字我认为只是为了带出 7.3,但是 03/02 00:46
33F:→ phishingphi: 函数 pass-by-value parameter 的通常不需要带 const 03/02 00:49
34F:→ phishingphi: pass-by-reference 则要看情况。 03/02 00:50
35F:→ phishingphi: (小结後面的但是好像应该摆到上面...和书的字面内容 03/02 00:51
36F:→ phishingphi: 无关,纯属个人看法)。 03/02 00:51
37F:推 steve1012: 原 po哪里写了 const 吗 怎麽没看到 03/02 01:28
38F:推 adrianshum: 理解成这样就好了:一般情况下function 只能return 03/02 02:51
39F:→ adrianshum: 单一数值,所以caller 只能用单一变数接收,意味一 03/02 02:51
40F:→ adrianshum: 次function call 只能影响到一个变数。要一次影响多 03/02 02:51
41F:→ adrianshum: 个变数就请用pass by ref 03/02 02:51
42F:→ phishingphi: 回网友 steve1012:图片7.3有类似的含义,只是顺着原 03/02 18:37
43F:→ phishingphi: po的例子探讨1. pass by value 的argument 要不要加 03/02 18:37
44F:→ phishingphi: const 2. pass by value 因为是 copy 所以函数要怎麽 03/02 18:39
45F:→ phishingphi: 改就怎麽改,我认为不用加const。都是7.3延伸。原po 03/02 18:39
46F:→ phishingphi: 用黄色框起来的字只是连结7.3的转折语而已。 03/02 18:39