我可以将赋值结果传递给 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++ 中的函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

问题将模板类型传递给函数并用于局部变量赋值 c++

可以将任何原始类型传递给需要指针的函数吗?

为啥不允许将数组按值传递给 C 和 C++ 中的函数?

将向量传递给C++中的线程函数

C++提高:拷贝构造函数

C++提高:拷贝构造函数