我可以将赋值结果传递给 c++ 中的函数吗?
Posted
技术标签:
【中文标题】我可以将赋值结果传递给 c++ 中的函数吗?【英文标题】:Can I pass the result of an assignment to a function in c++? 【发布时间】:2013-04-25 09:43:15 【问题描述】:我的问题是:“”
我想这样做的原因是变量具有特定类型,例如“int”,所以我将值分配给变量并将整个内容传递给以“int”作为参数的重载函数。
这样做的主要原因是为了让代码更小更容易阅读,所以而不是:
val = 2
function(val);
我明白了:
function(val = 2);
这样好吗? 如果是这样,是否有约定说由于某种原因这是一种糟糕的编码习惯?
谢谢, 饲料
【问题讨论】:
“更小”我可以看到。 “更容易阅读”我不明白。不要试图变得聪明,要简单。先赋值,再调用函数。这绝对不是惯用的 C++ 代码,也不推荐。 如果我看到function(val = 2);
,我的第一印象可能是你写了function(val == 2);
,即传递一个布尔值。你的第一种方法显然更好。
两个有效点 :) ...我没有考虑下一个用户的外观:o
function(val = 2);
在我看来就像命名参数 :) C++ 不支持(目前)。
【参考方案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。那里对我来说很好的额外信息:) ...我也会看看这本书。以上是关于我可以将赋值结果传递给 c++ 中的函数吗?的主要内容,如果未能解决你的问题,请参考以下文章