鱼C论坛

 找回密码
 立即注册
查看: 830|回复: 6

求助

[复制链接]
发表于 2023-6-9 18:54:01 | 显示全部楼层 |阅读模式
1鱼币
3、设有int i;则表达式i=1,++i,++i||++i,i的值为 (  C )
    A).1      B).2      C).3      D).4
4、设有int i;则表达式(i=1,i=10)?i++||++i:++i的值为 (A   )
    A).1      B).2       C).3      D).10
对于这两个题第三题问i的值输出的为3,第四题输出1,是因为对与第三题逻辑运算符结果不是布尔类型而条件运算符结果为布尔类型吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 19:00:41 | 显示全部楼层
对。

第三题

  1. i=1,++i,++i||++i
复制代码


首先执行逗号运算符,将i赋值为1,然后执行两次前缀自增运算,此时i的值变为3。最后执行逻辑或运算符,此时++i的值为4,因为短路逻辑,执行到第一个++i后不再执行第二个++i,因此结果为3。


                               
登录/注册后可看大图


第四题

  1. (i=1,i=10)?i++||++i:++i
复制代码


首先执行条件运算符,此时(i=1,i=10)的返回值为10,执行分支i++||++i,因为短路逻辑,所以不在执行++i。执行到第一个i++时,即将i变为2,此时结果的值为真,不再执行后面的++i,因此结果为1。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 19:05:26 | 显示全部楼层
对于你的问题,实际上这两个问题都涉及到了C++中的运算符优先级和短路运算。

在第一个问题中, i=1,++i,++i||++i,i 。首先,逗号运算符 , 是最低优先级的运算符,它会按照从左到右的顺序依次执行表达式。在每个逗号分割的表达式中,先执行赋值 = ,然后执行前置自增 ++ ,最后执行逻辑或 || 。但是, || 运算符存在短路特性,也就是当它的左边为真时,右边的表达式就不会被执行。所以在这个例子中,先执行 i=1 ,然后执行 ++i ,因为 ++i 的结果是2(真),所以 ||++i 不会执行,即 i 的值在 ++i||++i 表达式结束后为2,然后再执行最后的 i ,使 i 的值变为3。

对于第二个问题, (i=1,i=10)?i++||++i:++i 。首先,三元运算符 ?: 的优先级仅高于赋值运算符 = 和逗号运算符 , ,所以首先执行 (i=1,i=10) , i 的值变为10,然后判断 i 的值是否为真(非0为真),由于 i 的值为10,所以执行 ?: 运算符后面的 i++||++i ,但是和第一题一样, || 存在短路特性,所以 i++ 的结果为10(真),因此 ++i 不会执行,所以整个表达式的值为10。

对于你的问题,“是因为对与第三题逻辑运算符结果不是布尔类型而条件运算符结果为布尔类型吗”,这个解释并不准确。实际上,这两题的结果都和逻辑运算符的短路特性有关,而不是他们的结果是否为布尔类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-9 19:26:39 | 显示全部楼层
isdkz 发表于 2023-6-9 19:05
对于你的问题,实际上这两个问题都涉及到了C++中的运算符优先级和短路运算。

在第一个问题中, i=1,++i, ...

但是第四题答案为1啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 19:28:10 | 显示全部楼层
tttttt@@@@@@ 发表于 2023-6-9 19:26
但是第四题答案为1啊

对不起,我之前的解释中出现了错误,我感到非常抱歉。在C++中, i++||++i 的表达式的值并不是 i++ 或者 ++i 的值,而是其结果的布尔值,这与C++的运算符规则有关。

在C++中,逻辑运算符 || 或者 && 的结果总是返回布尔类型的值,即0或者1。在你的问题中, (i=1,i=10)?i++||++i:++i ,这个表达式的意思是,如果 (i=1,i=10) 的结果为真(非0),那么执行 i++||++i ,否则执行 ++i 。在这个例子中, (i=1,i=10) 的结果是10(非0),因此真,所以执行 i++||++i 。 i++||++i 的结果为真(非0),所以返回的是1,即布尔值的真。

所以,第四题的答案为1是正确的。对于我之前的解释,我向你表示歉意,我会尽力避免在将来的解答中出现此类错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-9 19:30:17 | 显示全部楼层
isdkz 发表于 2023-6-9 19:28
对不起,我之前的解释中出现了错误,我感到非常抱歉。在C++中, i++||++i 的表达式的值并不是 i++ 或者 + ...

那第三题为什么不是返回布尔型啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 19:39:44 | 显示全部楼层
tttttt@@@@@@ 发表于 2023-6-9 19:30
那第三题为什么不是返回布尔型啊

首先,我们回顾一下第三题的表达式  i=1,++i,++i||++i,i 。在 C++ 中,这个表达式涉及到了三种运算符:赋值运算符  = ,逗号运算符  , ,以及逻辑或运算符  || 。

在这个表达式中,逗号运算符  ,  的优先级最低,因此整个表达式可以被理解为执行以下四个操作:
1.  i=1
2.  ++i
3.  ++i||++i
4.  i

每个操作的结果都会被逗号运算符  ,  丢弃,只有最后一个表达式  i  的结果会被保留。这也就是为什么这个问题的答案是  3 ,因为在最后一个表达式  i  中, i  的值已经是  3 。

而对于  ++i||++i ,尽管  ||  运算符的结果是布尔类型,但是这个结果在逗号运算符  ,  之后被丢弃了,因此不会影响  i  的值。所以,这个表达式的值并不是  ||  运算符的结果,而是  i  的当前值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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