在函数调用的参数中使用赋值运算符

时间:2014-07-30 09:42:25

标签: c++

我是c ++的初学者,任何人都可以解释这段代码:

#include <iostream>

void display(int b)
{
    std::cout << b << std::endl;
}

int main()
{
    int a;

    display(a=10);//display 10

    std::cout << a << std::endl;//also display 10

    return 0;
}

我知道我们可以使用=运算符来设置函数参数的默认值,但是在函数调用中,显然“disply(a = 10)”将值10传递给函数并将其存储在变量中“ “在同一时间。

这是c ++中的正确​​编码,是否有人可以解释赋值部分?

5 个答案:

答案 0 :(得分:2)

该行

display(a=10);//display 10

等于:

a = 10;
display(a);

这是因为条款a = 10;的值是a

我认为这可以回答你的问题。

答案 1 :(得分:2)

您需要了解更多=运算符。它不仅将rhs(右侧)值分配给lhs(左侧),而且指的是 lhs。

假设此代码:

a = b = c;

完全等于

a = (b = c);

因为=是右关联的。

如果c为10,则代码将10分配给b,并将b的值分配给a。现在a == b == c == 10

答案 2 :(得分:1)

内置赋值运算符=

  • 右关联
    这意味着它分组到右边,例如a = b = c表示a = (b = c)

  • 是一个左值表达式,引用左侧。

请注意,在C中,赋值会生成纯,而在C ++中,它会生成引用(使用引用的通用语言)。

这意味着您可以为多个变量分配值:

a = b = c = 12345;

被解析为

a = (b = (c = 12345));

首先将12345复制到c,然后将c复制到b,然后将b复制到a

这意味着您可以分配作业的结果:

((a = b) = c) = 12345;

首先将b值复制到a,然后将c值复制到a,然后将12345复制到a,保持bc不变......

在您的情况下,代码

display(a=10);

相当于

a = 10;  display( a );

由于display函数的值为int,因此相当于

display( 10 )

但如果display有一个引用参数,则无法以这种方式重写。


常见的陷阱是写

if( x = 12345 )

当一个人意味着进行比较时,

if( x == 12345 )

如果警告级别提高,许多编译器会警告第一个编译器,应该如此。

更有保障的方法来检测它包括

  • 在任何地方使用const都可以使用。
    x时无法分配const。这是我的首选解决方案。

  • 写作if( 12345 == x )
    有些人更喜欢这个,但我觉得很难阅读,而且与const相反,只有当作者已经在这一点上非常清楚这个问题时,它才有助于避免错误输入。

  • 通过宏定义自定义if构造 从技术上讲,这也适用于使用布尔条件的其他构造,但为了有用,这样的宏应该很短,这会冒名称冲突的风险。对于不熟悉(有效)自定义语言的维护者来说也很难。


在C ++ 03中,标准库要求任何容器元素类型都应可分配,并且可分配条件要求自定义赋值运算符T::operator=应该返回T&(C ++03§23.1/ 4) - 这也是内置赋值运算符的要求。

直到我了解到我曾经用结果类型void定义赋值运算符,因为我认为支持带有副作用的表达式编码没有意义(这通常是一种不好的做法),但代价是效率和冗长。

不幸的是,在C ++中你需要支付你不使用的东西,通常不应该使用。

答案 3 :(得分:0)

C,C ++中的作业<variable> = <value>表达式,这意味着它有一个值,当然这个值是您刚刚分配的<value>

这就是为什么你可以为这样的多个变量赋值的原因:

a = b = c = 1;

因为内部它的工作原理是这样的

a = value of (b = value of (c = 1));

由于赋值确实有值,因此(c = 1)的值为。{1}} 1(b = (c = 1))的值为1,因此我们得到a = 1。而作为一个

如果作业不是表达式而没有值,我们会的 得到一个错误,因为value of (c = 1)不存在,我们会得到一个 语法错误。

因此,在您的代码中,display(a=10);表示:*将值a设置为10并传递 结果值(将为10)作为函数display的参数。

答案 4 :(得分:0)

这是对的。

 display(a=10); //It assigns 10 to a and 10 is passed as the parameter to function.