论无解的阿里2016校园招聘题
2015-08-26 13:05
316 查看
以下代码是阿里2016级校园招聘比试题目:
//clang提示编译警告:multiple unsequenced modifications to v
#include <iostream>
using namespace std;
void __cdecl func(const int& v1, const int&v2){
cout<<v1<<' '<<v2<<endl;
}
int main(){
int v = 0;
func(++v, v++);
}
然后有四个答案,其中有2 0和2 1,事实上,在微软的Visual Studio上测试结果是2 0,在Clang和XCode(后台使用Clang)上是2 1,那么问题来了,哪个对?
结果是没有一个对,也没有一个错,这个题目是没有答案的。
C(++)语言中有序列点的概念,序列点要求在序列点上,前面求值的所有副作用应该全部完成,比如,函数调用就是一个序列点,在函数调用实施前,参数的求值及其副作用应该被全部计算完成。C语言中规定,逗号运算符、三元运算符、逻辑与、逻辑或有序列点。
逗号运算符:(函数调用里面的那个逗号是参数分割号,而不是逗号运算符)
#include <Iostream>
using namespace std;
void f(const int& ref){
cout<<ref<<' ';
}
int main(){
int val = 0;
f(val++),f(val++);
}
以上代码显然输出0,1。因为逗号运算符是个序列点,左边的f调用及其副作用必须先计算再进行右边的f调用及副作用。
三元运算符,逻辑与,逻辑或等与此类似,不再详细描述。
在最开始的代码里面,惟一可以保证的是在func调用之前,两个参数v1,和v2均会被计算、副作用均已完成以及参数从右到左入stack,至于先计算v++还是++v及其副作用是无定义的,也就是说,编译器想怎么计算就怎么计算,保不准在某个编译器上输出1,1。
//clang提示编译警告:multiple unsequenced modifications to v
#include <iostream>
using namespace std;
void __cdecl func(const int& v1, const int&v2){
cout<<v1<<' '<<v2<<endl;
}
int main(){
int v = 0;
func(++v, v++);
}
然后有四个答案,其中有2 0和2 1,事实上,在微软的Visual Studio上测试结果是2 0,在Clang和XCode(后台使用Clang)上是2 1,那么问题来了,哪个对?
结果是没有一个对,也没有一个错,这个题目是没有答案的。
C(++)语言中有序列点的概念,序列点要求在序列点上,前面求值的所有副作用应该全部完成,比如,函数调用就是一个序列点,在函数调用实施前,参数的求值及其副作用应该被全部计算完成。C语言中规定,逗号运算符、三元运算符、逻辑与、逻辑或有序列点。
逗号运算符:(函数调用里面的那个逗号是参数分割号,而不是逗号运算符)
#include <Iostream>
using namespace std;
void f(const int& ref){
cout<<ref<<' ';
}
int main(){
int val = 0;
f(val++),f(val++);
}
以上代码显然输出0,1。因为逗号运算符是个序列点,左边的f调用及其副作用必须先计算再进行右边的f调用及副作用。
三元运算符,逻辑与,逻辑或等与此类似,不再详细描述。
在最开始的代码里面,惟一可以保证的是在func调用之前,两个参数v1,和v2均会被计算、副作用均已完成以及参数从右到左入stack,至于先计算v++还是++v及其副作用是无定义的,也就是说,编译器想怎么计算就怎么计算,保不准在某个编译器上输出1,1。
相关文章推荐
- Rust之语法<3>数据类型
- UVA839递归
- Rust初步(四):在rust中处理时间
- Windows Server Backup与NtBackup
- C# 使用 SAP NCO3.0 调用SAP RFC函数接口
- Codevs 1021 玛丽卡
- 排序4种
- BigDecimal加减乘除运算
- and5.1PowerManagerService深入分析(二)PowerManager中各函数
- mac上node+express+ejs前端项目搭建
- [Leetcode]Missing Number
- 优化Win10虚拟内存使用:英伟达GF 355.80热修复驱动以及下载
- Mysql update语句赋值嵌套select
- 递归获取子节点
- 一列变多列
- 打开tcp_tw_recycle引起的一个问题
- c++基础(一)
- Windows下压缩和解压命令
- 日期控件html
- TCP三次握手,什么情况下client会回复reset