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

检测点8-17

[复制链接]

620

主题

336

回帖

1057

积分

管理员

积分
1057
发表于 2026-3-7 19:45:33 | 显示全部楼层 |阅读模式
检测点8-17

1.关于表达式(* d ++ = * s ++) != '\0',判断以下说法是否正确,并说明原因。
(1)先得到运算符++的结果,再计算一元*运算符的值。()
答:正确。先得到操作数的值,再得到运算符的结果,而一元*运算符的操作数是后缀递增表达式。

(2)先得到子表达式* d ++和* s ++的值,再计算运算符“=”的值。()
答:正确。先得到操作数的值,再得到运算符的结果,而运算符=的操作数是表达式* d ++和* s ++。

(3)先计算表达式(* d ++ = * s ++)和'\0',再计算运算符“!=”的值。()
答:正确。先得到操作数的值,再得到运算符的结果,而运算符!=的操作数是表达式(* d ++ = * s ++)和'\0'。

(4)运算符“++”的副作用和它的值计算同时发生。()
答:错误。表达式的值计算和副作用不必同时发生,只要在整个大表达式的求值期间完成即可。

2.如果我们将d ++的值计算记为Vd++,副作用记为Sd++;将s ++的值计算记为Vs++,副作用记为Ss++;将赋值表达式的值计算记为V=,副作用记为S=;再将运算符“!=”的结果(整个表达式的值)记为V!=,那么,表达式(* d ++ = * s ++) != '\0'的求值过程有没有可能是这样的:
Sd++ → Vs++ → Ss++ → S= → V= → Vd++ → V!=
为什么?请再列举至少三种可能的求值顺序。
答案:
不可能。后缀递增和递减表达式的值计算发生在其副作用之前,所以Sd++不可能先于Vd++。
以下是三种可供参考的求值顺序:
Vd++ → Vs++ → Ss++ → S= → V= → Sd++ → V!=
Vd++ → Sd++ → Vs++ → Ss++ → S= → V= → V!=
Vs++ → Vd++ → S= → V= → V!= → Sd++ → Ss++

3.如果将源文件中的声明
char a [10] = "Hi,";
改为
char * a = "Hi,";
则程序运行时会怎样?为什么?
答:可能出现无法预料的结果(比如崩溃)。因为指针对象a所指向的字符串位于一个不允许修改的内存区域。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-3-30 17:53 , Processed in 0.250523 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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