找回密码
 立即注册
搜索
热搜: 活动 通知
楼主: xiaocai

标准C语言指南 中的 疑问?

[复制链接]

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-5 09:56:09 | 显示全部楼层
我这样理解了下:

求值 包含了 值计算  和 副作用 ,两个都是选用  

a=1 ;从整个表达式a=1看  只有副作用  没有值计算,如果放到  b=a=1 那么a=1是有值计算,又有了副作用

值计算包含了通常的 获取数值,以及不那么通常的  获得指示对象

也就是a=1  和  &a   中的a属于通过表达式a  获取指示对象的  一种求值

有些表达式放到语境了,根本不需要求值  

sizeof a   这种a不需要获取指示对象,  只需要知道类型就可以, 哪怕  sizeof *p  也只需要编译器 结合上下文  知道其类型就行

a;  这个时候,a也是不求值,而且编译器觉得这个语句没用 可能就直接删除了,更无从谈求值。

344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-5 11:25:22 | 显示全部楼层
这个问题已经说得很清楚了。关于表达式的求值,标准里也已经说得很清楚了。标准里已经表明以下问题:

1,什么是求值;
2,什么情况下不用求值。

因此,对于表达式 a = 1 来说,子表达式 a 用来指示一个对象,这就是它的使命,你还对它求值干什么?有什么作用?有什么意义??就好比表达式 sizeof (a = 1),因为求值 a = 1没有用处,所以就不会求值。

所以这是一个标准条款的适用性问题。标准只说了什么是求值,但并没说但凡是表达式都要拿过来求值。相比之下,表达式 a = 1 里面的 a 有更好的适用条款:

6.5 Expressions
1 An expression is a sequence of operators and operands that specifies computation of a value, or that designates an object or a function, or that generates side effects, or that performs a combination thereof.

翻译过来就是,表达式的作用是计算一个值,指示一个对象或者函数,产生一个副作用,或者兼而有之。显然,在表达式  a = 1 里的 a 就是指示一个对象,这是很明显的了,不需要进一步追究求值的事情,毕竟求值的概念也没说求值适用于什么情况,适用于哪些表达式。

同时,这里还有个一般和特殊的哲学问题。照标准的上述说法,一个表达式是一个运算符和操作数的序列。如果严格来扣字眼的话,
y = 1
是表达式,而
y
不是表达式,因为没有运算符,只有操作数。

标准是用来解决分歧的,而不是制造分歧。

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-5 11:50:23 | 显示全部楼层
本帖最后由 xiaocai 于 2024-1-5 12:13 编辑
站长 发表于 2024-1-5 11:25
这个问题已经说得很清楚了。关于表达式的求值,标准里也已经说得很清楚了。标准里已经表明以下问题:

1, ...

但是按照标准:  指示一个对象  就是求值,只是这个求值不算是传统的取数值而已

y=1 中的y也是表达式,这是标准中,定义的

赋值运算符的左边 是一个左值,所以就是一个表达式,而且你的书中 也称左边这个操作数是表达式,为什么突然说不是了?

An assignment operator shall have a modifiable lvalue as its left operand.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-5 13:01:06 | 显示全部楼层
还左值表达式,
这不是逗笑吗。
左值本身就是表达式。

我看大家已经没话说了,
结帖!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-7-27 16:23 , Processed in 0.219539 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表