免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 35978 | 回复: 135

[C] a+b=c跟c=a+b为什么不一样? C新新手问题 [复制链接]

论坛徽章:
0
发表于 2008-04-23 23:59 |显示全部楼层
我要把a和b相加,然后赋值给c, 为什么我写成a+b=c就编译出错,写c=a+b就没有问题?? 这2个式子不一样么??为啥呢?谢谢

论坛徽章:
0
发表于 2008-04-24 00:00 |显示全部楼层
等号是赋值运算,不能把值赋给a+b
只能把a+b赋给c

论坛徽章:
0
发表于 2008-04-24 00:02 |显示全部楼层
我写成a+b=c出错阿,我是linux下gcc

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2008-04-24 00:03 |显示全部楼层
原帖由 弹头 于 2008-4-24 00:02 发表
我写成a+b=c出错阿,我是linux下gcc

哥们,有c语言教科书吗?
没有去买一本。

论坛徽章:
0
发表于 2008-04-24 00:07 |显示全部楼层
书上就说c=a+b这种,可是没说为啥?为啥a+b=c这种不行呢?

论坛徽章:
0
发表于 2008-04-24 00:13 |显示全部楼层
哥们我看好你哦。

当年我初学C,也这么问过老师,可能老师忙着去泡妞了,也没给我解释明白。

结果我C考试时也就糊里糊涂,最后不及格。

论坛徽章:
0
发表于 2008-04-24 00:13 |显示全部楼层
难道说就是语法规定,没有什么为什么,必须这么写??

论坛徽章:
0
发表于 2008-04-24 00:14 |显示全部楼层
原帖由 motalelf 于 2008-4-24 00:13 发表
哥们我看好你哦。

当年我初学C,也这么问过老师,可能老师忙着去泡妞了,也没给我解释明白。

结果我C考试时也就糊里糊涂,最后不及格。




晕.............呵呵呵呵呵呵

论坛徽章:
0
发表于 2008-04-24 00:21 |显示全部楼层
当然概括可能不准确,表达不清晰。我对GCC也没什么研究,只是条件反射。



左值的存放地址,必须在编译时确定。

如果你是c=a+b,那么&c就是编译时确定下来的值,伪代码相当于 movl  (a+b)  [&c];

如果你是a+b=c,根本没办法再编译时确定c的值到底存放在那里,a+b并不是个常量。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2008-04-24 00:26 |显示全部楼层
编程语言中借鉴了很多数学符号/概念,
但是这些符号和数学课本上的符号/概念还是有很大区别的。

就拿 = 这个符号来说,数学上把它叫做“等号”,
但是 C 语言里,它不是“等号”,而是“赋值号”,
C 语言里的“等号”是 ==,也就是两个等号连起来这样子。
== 满足交换律,c == a+b 和 a+b == c 是同一个意思,
但是 = 不满足交换律,它是有方向的,它的方向,代表了赋值的方向,
也就是数据存取的方向。

c=a 的意思是把 a 的值取出来,存入 c,
a=c 的意思是把 c 的值取出来,存入 a,
它们俩的含义显然是不同的。
反应到你的例子中,
c=a+b 就是把 a 和 b 的值取出来,进行加法运算,然后把结果存入 c,但是 a+b=c 是什么意思呢?难道是把 c 的值取出来存入 a+b 吗?
因为 a+b 不是一个变量,因此无法往里面存入值,
因此 a+b=c 是错误的。

等你后来慢慢学的深入了,就知道 a+b 其实是一个右值(right value),不是左值(left value),
因此不能往它里面存入(store)任何数据,但是 c 就是一个左值(left value),可以往里面存入(store)和它的类型相匹配的值。

一言以蔽之,计算机是“工科”,数学是“理科”,学习时要注意区别对待。计算机是实践性很强的一门科学,它不是纯理论,因此学习理论知识时,应该结合电脑硬件的基本工作流程来学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP