【问题标题】:Can I pass the result of an assignment to a function in c++?我可以将赋值结果传递给 c++ 中的函数吗?
【发布时间】:2013-04-25 09:43:15
【问题描述】:

我的问题是:“我可以将赋值结果传递给 c++ 中的函数吗?”

我想这样做的原因是变量具有特定类型,例如“int”,所以我将值分配给变量并将整个内容传递给以“int”作为参数的重载函数。

这样做的主要原因是为了让代码更小更容易阅读,所以而不是:

val = 2
function(val);

我明白了:

function(val = 2);

这样好吗? 如果是这样,是否有约定说由于某种原因这是一种糟糕的编码习惯?

谢谢, 饲料

【问题讨论】:

  • “更小”我可以看到。 “更容易阅读”我不明白。不要试图变得聪明,要简单。先赋值,再调用函数。这绝对不是惯用的 C++ 代码,也不推荐。
  • 如果我看到function(val = 2);,我的第一印象可能是你写了function(val == 2);,即传递一个布尔值。你的第一种方法显然更好。
  • 两个有效点 :) ...我没有考虑下一个用户的外观:o
  • function(val = 2); 在我看来就像命名参数 :) C++ 不支持(目前)。

标签: c++ function variable-assignment


【解决方案1】:

是的

每段§ 5.17 / 1

赋值运算符 (=) 和复合赋值运算符 all 从右到左分组。都需要一个可修改的左值作为左值 操作数并返回一个引用左操作数的左值。

在function(val = 2) 之后,2 赋值给val 然后val 的值传递给函数。

谈可读性并不容易,我个人不会在我的代码中使用这种方式。

【讨论】:

  • 感谢您的回答:),关于作业链的最后一部分我不明白......
  • 表达式a = b = c 被计算为a = (b = c)。 b = c 会将c 分配给b,然后产生b 作为结果。然后将其分配给a,产生a 作为结果。您可以将任何表达式(希望我不会因为该术语的确切含义而偏离窗口太远)传递给函数,包括包含赋值的函数。请注意,在用户定义的类型上使用重载运算符,您可以打破赋值产生左侧结果的规则。
  • @doomster:几乎每个表达式。该术语是正确的,语法允许,但从语义上讲,您被禁止传递 void 类型的表达式。例如。给定函数void f();,无法传递表达式f()。
【解决方案2】:
 "Can I pass the result of an assignment to a function in c++?"

是的,我们当然可以这样做。编译器将打破这条语句function(val = 2) in 两个步骤,首先将 2 分配给 val 然后使用参数 2 调用函数。因此,前两种方法比第二种方法更清晰和可读。

【讨论】:

  • 实际上,调用将使用val,而不是2。这在调用void function(int& param) 时很重要 - 您不能修改 2,但可以修改 val。
  • 函数将使用 val 调用,它是 2 它不是引用调用它的值调用。
  • 你为什么认为这是价值调用?此外,还有其他可以注意到差异的情况。例如。当function 采用另一种类型,并且需要转换时,则val 将被转换。
【解决方案3】:

C++ 确实允许这样做,但如果我是你,我不会这样做。

并非 c++ 允许您做的所有事情都是好主意。一个好的程序员必须考虑两件事:可读性和可维护性。一位博主(我不记得是谁)曾经说过,程序员不是为计算机编程,他们应该为程序员编程。

这意味着您应该尝试使内容尽可能易于阅读。将多行压缩为一行实际上会降低可读性,因为读者必须停下来思考不止一件事,他们必须分析压缩后的语句,而不是仅仅阅读它。

您想要做的也可以隐藏由拼写错误造成的错误。比如说,你输入了

function(val == 2)

错了。编译器也会允许这样做,因为它会将 bool 转换为 int。除非他/她非常了解参数列表,否则其他读者也不会发现这个错误。

如果您对有关良好编程构造技术的技巧和窍门以及建议感兴趣,我强烈推荐Code Complete 2。我已经拥有这本书多年了,但我仍在学习新东西来改进我的代码。

【讨论】:

  • 感谢 RobbieE。那里对我来说很好的额外信息:) ...我也会看看这本书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多