找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 1544|回复: 13

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

[复制链接]

4

主题

12

回帖

105

积分

注册会员

积分
105
发表于 2023-12-31 20:40:26 | 显示全部楼层 |阅读模式
本帖最后由 xiaocai 于 2023-12-31 20:58 编辑



这里说:计算运算符=左右两个操作数的值,但是我记得你说赋值左边的操作数是表示对象,不求值的,所以这里=是不是笔误,应该是+运算符,对吗?





像这个如果细分下去,++x 和y++的求值 又包含了x的求值  和  y的求值对吗?




本帖子中包含更多资源

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

×

344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2023-12-31 20:58:08 | 显示全部楼层
这是从广义上来说的。对本例来说当然是不计算的。但是,考虑
* p = 1;
在这里,左操作数 * p是有值计算的,要计算p的值。

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2023-12-31 21:08:20 | 显示全部楼层
本帖最后由 xiaocai 于 2023-12-31 21:15 编辑
站长 发表于 2023-12-31 20:58
这是从广义上来说的。对本例来说当然是不计算的。但是,考虑
* p = 1;
在这里,左操作数 * p是有值计算的, ...
好的,懂了

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-3 20:17:36 | 显示全部楼层
本帖最后由 xiaocai 于 2024-1-3 20:30 编辑
站长 发表于 2023-12-31 20:58
这是从广义上来说的。对本例来说当然是不计算的。但是,考虑
* p = 1;
在这里,左操作数 * p是有值计算的, ...

*p=1;  
你说*p有值计算的,要计算p的值,那么计算p的值以后 ,再进行*运算得到一个对象,这个过程算表达式的求值吗?这个对象是整个表达式的值?
又或者说整个*p表达式没求值?只是p求值?


344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-3 20:44:45 | 显示全部楼层
求值(Enaluation)包括值计算和副作用,但也可能只有值计算。

求值是表达式的作用之一,不是必需的。

求值p得到一个指针(类型的值),*作用于这个值,得到一个对象,这就停止了。

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-3 20:47:31 | 显示全部楼层
本帖最后由 xiaocai 于 2024-1-3 20:50 编辑
站长 发表于 2024-1-3 20:44
求值(Enaluation)包括值计算和副作用,但也可能只有值计算。

求值是表达式的作用之一,不是必需的。

所以但凡最后的表达式是表示一个对象的,哪怕中间很多步骤得到这个对象,不算表达式求值?

344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-3 22:29:49 | 显示全部楼层
xiaocai 发表于 2024-1-3 20:47
所以但凡最后的表达式是表示一个对象的,哪怕中间很多步骤得到这个对象,不算表达式求值? ...

你这样说不就否定了自己以前的说法了吗。

具体问题具体分析吧。
* p = 1
对这个表达式的求值包括值计算和副作用。值计算是计算这个赋值表达式的值,副作用是将1赋给左值 * p ;

要求值这整个表达式,需要先求值子表达式 * p 和 常量表达式 1 ;

要求值表达式 * p,需要先求值子表达式 p ;

表达式 * p 求值的结果是一个左值。But,你会说,不是说左值不求值吗,,

我确实不太赞同这样说,但事实就是,标准里强调:

“Evaluation of an expression in general includes both value computations and initiation of side effects.Value computation for an lvalue expression includes determining the identity of the designated object.”

求值 * p 包含一个值计算,这个值计算实质上是得到被指向的那个对象,即,得到一个左值。

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-4 07:42:11 | 显示全部楼层
本帖最后由 xiaocai 于 2024-1-4 08:32 编辑
站长 发表于 2024-1-3 22:29
你这样说不就否定了自己以前的说法了吗。

具体问题具体分析吧。

,确实我会问:之前不是说了左值不求值吗? 但是现在按照标准,又属于求值了。好复杂。
那么 a=1 这个如果按照标准,表达式a也算求值了吧,也是得到被指向的那个对象。但是标准又说:
In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or through volatile access to an object).

那么&a 、a=1,sizeof a 等,这时的表达式a 算求值还是没求值?

有点晕了。之前跟朋友讨论左值转换,我说a=1 中的a没求值,也就没有左值转换


344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-4 12:33:44 | 显示全部楼层
xiaocai 发表于 2024-1-4 07:42
,确实我会问:之前不是说了左值不求值吗? 但是现在按照标准,又属于求值了。好复杂。
那么 a=1 这个如果 ...

我认为标准说得非常清楚。比如语句
x = y;
要求值y,但是整个表达式 x = y 的求值只有副作用,不进行值计算,因为值计算的结果就是计算了也被丢弃;再比如语句
f (x = y);
表达式 x = y 的求值既有副作用,也有值计算,因为它的值要被传递给函数 f。再比如
sizeof (x = y)
表达式 x = y 的求值是不进行的:既不发起副作用,也不进行值计算,因为 sizeof 运算符只抽取操作数的类型,如果不求值就可以得到操作数的类型,则不会求值。因此,
int x = 0, y = 1;
printf ("%zu\n", sizeof (x = y));
printf ("%d\n", x);
打印的结果是
4
0

4

主题

12

回帖

105

积分

注册会员

积分
105
 楼主| 发表于 2024-1-4 14:38:29 | 显示全部楼层
本帖最后由 xiaocai 于 2024-1-4 15:00 编辑
站长 发表于 2024-1-4 12:33
我认为标准说得非常清楚。比如语句
x = y;
要求值y,但是整个表达式 x = y 的求值只有副作用,不进行值计 ...

对,你说的这几个我还都能理解,但是有些就不好理解。

按照我的感觉  &a,  a=1 中的表达式a都是没求值。*p=1这种里的  *p表达式好像有求得对象,勉强有求值,反正这种作为子表达式的左值就怪怪的

a+1 这种里面的a也很好判断,肯定是要求值的,因为值要与1相加。但是你说&a这种 求a的值也没啥用啊 ,a=1中的a也不要获取值啊,但是如果要说指示某个对象算求值,那这两个a也是了

不就是你发的这句


Value computation for an lvalue expression includes determining the identity of the designated object
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-7-27 16:03 , Processed in 0.246990 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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