以下代码是阿里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><
//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><