【问题标题】:can I use "x=2" as an argument inside an if statement?我可以在 if 语句中使用“x=2”作为参数吗?
【发布时间】:2023-04-05 05:23:01
【问题描述】:

所以我刚刚参加了一个 CS101 C++ 测验,这是其中一个问题:

int x=5;
if(x=2)
  cout <<"this is true"<<endl;
else
  cout <<"this is false"<<endl;
  cout <<"this is all folks"<<endl;

对于可能的输出给出了以下选择

a. this is true
b. this is false
c. this is true
   this is false
d. this is true
   this is all folks
e. None of the above

现在我注意到 if 语句正在测试一个赋值,所以我圈出了 e.),因为我认为输出应该是语法错误。我不认为一个作业不能被评估为真或假。教练给我打错了。原因是大于 0 的参数为真。我告诉教授,除非 x=2 被括号括起来,否则这是不可能的。 x=2 本身不是真或假。讲师随后表示,我们不应该期望测试或测验中的代码可以运行,因为测试的是逻辑而不是语法。但从逻辑上讲,x=2 既不是真也不是假,对吧???

我不是在争论这些点;我弄错了只有两个中的一个。但教师坚持认为测验问题写得正确并结束了对话。我认为教练不喜欢我在这方面向她提问……她相当粗鲁地拒绝了我。无论如何,我使用 vim/g++ 运行代码,它给了我语法错误,建议我在赋值周围加上括号。是不是有些编译器比较挑剔??

【问题讨论】:

  • “我使用 vim/g++ 运行代码,它给了我语法错误” - 错误,还是只是一个警告
  • 是的,g++ 不会给你一个错误,除非你在命令行上指定-Werror。赋值是C语言中的表达式,所以x = 2赋值后的值为x,显然是2,那你怎么可以做a = b = c = 2;之类的事情

标签: c++ computer-science


【解决方案1】:

是:intbool 的转换:

if(x=2) //2 is non 0 converts to true

因此它将打印this is true。 A 和 D 是唯一剩下的选择。因为

else
  cout <<"this is false"<<endl;
  cout <<"this is all folks"<<endl; //not included in `else`, will print no matter what

this is all folks 也会打印出来。

正确答案是D。

【讨论】:

  • 这只是因为赋值运算符在设置后返回lhs,所以x=2返回x,即2non-zero,所以int被转换为临时boolean,其值为true
  • 我明白了......所以我是从编译器的角度来看的。当它只是一个警告时,我认为这是一个错误,并且代码会运行得很好。非常感谢!
猜你喜欢
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2020-02-18
  • 2011-02-16
  • 2022-07-12
  • 2020-11-09
相关资源
最近更新 更多