tttttt@@@@@@ 发表于 2023-6-9 18:54:01

求助

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,是因为对与第三题逻辑运算符结果不是布尔类型而条件运算符结果为布尔类型吗

Ewan-Ahiouy 发表于 2023-6-9 19:00:41

对。

第三题

i=1,++i,++i||++i

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

static/image/hrline/1.gif

第四题

(i=1,i=10)?i++||++i:++i

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

isdkz 发表于 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。

对于你的问题,“是因为对与第三题逻辑运算符结果不是布尔类型而条件运算符结果为布尔类型吗”,这个解释并不准确。实际上,这两题的结果都和逻辑运算符的短路特性有关,而不是他们的结果是否为布尔类型。

tttttt@@@@@@ 发表于 2023-6-9 19:26:39

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

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

但是第四题答案为1啊

isdkz 发表于 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是正确的。对于我之前的解释,我向你表示歉意,我会尽力避免在将来的解答中出现此类错误。

tttttt@@@@@@ 发表于 2023-6-9 19:30:17

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

那第三题为什么不是返回布尔型啊

isdkz 发表于 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的当前值。
页: [1]
查看完整版本: 求助