一个原始值的临时副本!
2016-08-08 18:22
134 查看
让我们来看看这最后一行是如何工作的更详细。首先,编译器将启动一个与x(5)相同的值的x的临时副本。然后它将原来的x从5增加到6。然后编译器评估临时副本,该副本计算为5,并将该值赋给Y。然后将临时副本丢弃。
因此,Y结束了5的值,x结束的值为6。
这里是另一个例子显示的差异之间的前缀和后缀版本:
int x = 5, y = 5;
cout << x << " " << y << endl;
cout << ++x << " " << --y << endl; // prefix
cout << x << " " << y << endl;
cout << x++ << " " << y-- << endl; // postfix
cout << x << " " << y << endl;
在第三行中,x和y是递增/递减之前,他们的评价,所以他们的新值打印由cout。在第五行,一个原始值的临时副本(x = 6,y = 4)发送给cout,然后原来的x和y是递增的。这就是为什么从后缀式操作符的结果没有改变到下一行。
规则:有利于后递增和后递减的预增量和预减量。前缀版本不仅更加高效,你就不太可能遇到奇怪的问题。
副作用
一个函数或表达式被称为有一个副作用,如果它修改一些状态(例如,在内存中的任何存储信息),输入或输出,或调用有副作用的其他功能。
大部分时间,副作用是有用的:
1
2
3
4
5
6
7
8
9
10
11
12
13
int add(int x, int y)
{
return x + y;
}
int main()
{
int x = 5;
int value = add(x, ++x); // is this 5 + 6, or 6 + 6? It depends on what order your compiler evaluates the function arguments in
std::cout << value; // value could be 11 or 12, depending on how the above line evaluates!
return 0;
}
因此,Y结束了5的值,x结束的值为6。
这里是另一个例子显示的差异之间的前缀和后缀版本:
int x = 5, y = 5;
cout << x << " " << y << endl;
cout << ++x << " " << --y << endl; // prefix
cout << x << " " << y << endl;
cout << x++ << " " << y-- << endl; // postfix
cout << x << " " << y << endl;
在第三行中,x和y是递增/递减之前,他们的评价,所以他们的新值打印由cout。在第五行,一个原始值的临时副本(x = 6,y = 4)发送给cout,然后原来的x和y是递增的。这就是为什么从后缀式操作符的结果没有改变到下一行。
规则:有利于后递增和后递减的预增量和预减量。前缀版本不仅更加高效,你就不太可能遇到奇怪的问题。
副作用
一个函数或表达式被称为有一个副作用,如果它修改一些状态(例如,在内存中的任何存储信息),输入或输出,或调用有副作用的其他功能。
大部分时间,副作用是有用的:
1
2
3
4
5
6
7
8
9
10
11
12
13
int add(int x, int y)
{
return x + y;
}
int main()
{
int x = 5;
int value = add(x, ++x); // is this 5 + 6, or 6 + 6? It depends on what order your compiler evaluates the function arguments in
std::cout << value; // value could be 11 or 12, depending on how the above line evaluates!
return 0;
}
相关文章推荐
- VB 版累计技术得分,数据统计来源:一个中间临时表,数据最不准确
- 一个关于临时对象的BUG(下)
- 一个“dirt simple”download-and-install CPAN的副本
- 使用Windows照片库修改图片后记得清理原始图片副本
- 一个关于临时对象的BUG
- 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
- VB 版累计技术得分,数据统计来源:一个中间临时表,数据最不准确
- [转]一个关于临时对象的BUG(下)
- autorun病毒的一个原始预防方法
- Clone 创建一个对象的副本
- 一个创业成功者原始资本的快速积累
- 在SQL Server中安全的创建,使用,和删除一个临时表
- 一个小发现:Internet临时文件夹设置过小会影响一些网页的正常运行
- 自动创建临时表,并给临时表添加一个自动增长的行号字段
- C源码:一个原始套接字的实例 (http://www.fanqiang.com)
- C#中如何防止一个程序运行多个副本(转载)
- 水晶报表使用CDO可以在内存中建立一个临时数据库,类似于VB的那个DataSet
- WinAPI: GetTempFileName - 生成一个临时文件名
- 有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
- 数组循环移动代码,只使用一个临时变量