我是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 ++中的正确编码,是否有人可以解释赋值部分?
答案 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
,保持b
和c
不变......
在您的情况下,代码
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.