首页 > 试题广场 >

有以下定义语句 double a,b; int w; lon

[不定项选择题]

有以下定义语句 double a,b; int w; long c;

若各变量已正确赋值,则下列选项中正确的表达式是()

  • a=a+b=b++
  • w%(int)(a+b)
  • (c+w)%(int)a
  • w=a==b;
。。。又一次了。。D不是表达式,是语句
发表于 2017-11-24 20:20:45 回复(16)
A.选项a+b是内置类型的右值表达式,所以无法对其赋值。但是假如是类类型的右值表达式,比如string就没问题:
string s1,s2;
s1 + s2 = "NowCoder";
以上代码在C++中是惊人的合法代码。
如果此时需要限制这种不合逻辑的表达式,那么有两种方法:
1.使用左右值引用限定符 “&”、“&&”限定拷贝赋值函数的this指针指向一个明确的左值或右值。
2.限定拷贝赋值函数的返回值为const

B.选项显然只是多了个右括号,如果这也算考点。。

C.D没毛病,都是需要隐式类型转换的货。

--------

2017.9.15更

回刷
上次没发现D选项有分号
确实是语句

上次B选项有问题
提交纠错后官方已修正
B选项缺少的左括号补回来了
但是导致B.C俩选项都正确
编辑于 2017-09-16 21:22:17 回复(0)

 🍹解题步骤


优先级顺序:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

A. a=a+b=b++

对于选项A,我们先按优先级计算 ++ ,然后计算 + ,最后计算赋值运算符 =
但当我们计算完 + 后,发现这时 a+b = b++ 出现错误
B. w%(int)(a+b)

对于选项B,先对()进行运算,即计算(a+b)的值,再强制转换为int型,最后进行取余运算
C. (c+w)%(int)a

对于选项C,先对括号进行运算,即计算(c+w)的值 ;同时进行对a强制转换为int型
最后进行取余运算
D. w=a==b;

对于选项D,D的最后有“;”,D是语句不是表达式


如果D是表达式的话,它先进行关系运算符 == 的计算,判断 a与b的值是否相等,相等返回1,不同返回0
然后将判断后的返回值赋值给w ✅

发表于 2022-01-23 20:54:06 回复(0)
A如R0b1n所说a+b是内置类型的右值表达式,所以无法对其赋值
B少了半个括号,应该不是题目本意,完整的应该是w%((int) a+b),但是还是有问题的,int+double是double,%运算符要求左右两个操作数都是整型
D如jelly_wxt所说,是语句不是表达式
发表于 2017-09-06 09:52:54 回复(0)
***直接好家伙,我怀疑这是在鼓励我在工作中这样写代码😂
发表于 2021-05-05 16:32:31 回复(0)
D项是语句,不是表达式
发表于 2017-09-04 22:12:08 回复(1)
A:a=a+b=b++;a+b是右值,右值是不可寻址或没有变量名,即不可赋值
BC:隐式转换
D:语句正确,非表达式
发表于 2023-11-29 19:55:31 回复(0)

粗心大意,D答案是表达式语句,有一个分号,虽然,结果正确,但是题目要求的是表达式

发表于 2019-06-28 21:49:01 回复(0)
擦,又是咬文嚼字
发表于 2018-09-13 13:08:09 回复(0)
a,b显然错误,d的话是想考察两个double比较不能直接==?因为存在精度差异?
发表于 2017-08-26 11:10:22 回复(0)
感觉看看就行,真项目里敲肯定要考虑可读性的
发表于 2022-06-22 19:40:29 回复(0)
D选项错因:浮点数的比较不能用==,因为计算机内部不能准确表示浮点数,IEEE754浮点数表示法了解一下。
发表于 2022-04-04 12:13:53 回复(0)
*****
发表于 2019-11-14 08:47:55 回复(0)

表达式后加分号变为语句


发表于 2019-04-11 16:25:26 回复(0)
跟我一样没注意到不定项的留个爪💔
发表于 2018-09-04 10:40:20 回复(0)
被D坑了→_→
发表于 2018-06-19 15:44:56 回复(0)
选cd 比较高于赋值
发表于 2017-08-25 16:14:52 回复(0)
这个表达式 `a = a + b = b++` 之所以不对,主要是因为它违反了赋值运算符的右结合性和赋值运算符的返回值规则。 1. **赋值运算符的右结合性**:在 C 和 C++ 中,赋值运算符 `=` 是从右到左的结合性。因此,表达式 `a = a + b = b++` 会被解释为 `a = (a + (b = b++))`。 2. **赋值运算符的返回值**:赋值运算符 `=` 的返回值是被赋值的值。所以,表达式 `b = b++` 会返回 `b` 的旧值。但是,这个表达式本身有一个问题,因为它试图在同一个表达式中修改 `b` 的值两次,这会导致未定义的行为。 在同一表达式中,`b` 的值被修改两次(一次由于 `b++`,一次由于 `b = ...`)。根据 C 和 C++ 的标准,这种行为是未定义的(undefined behavior)。这意味着编译器可以为这个表达式生成任何代码,或者不生成代码,而不会有任何警告或错误。程序的行为在这种情况下是不可预测的。
编辑于 2024-03-04 22:22:45 回复(0)
还有一个知识点,就是,浮点型不能==,因为浮点型精度的问题,比如 0.1+0.2 可能会得到一个不等于0.3的数
发表于 2023-10-21 21:20:47 回复(0)
D不是表达式,D是语句
发表于 2023-05-13 21:34:58 回复(0)