论无解的阿里2016校园招聘题

这篇博客探讨了阿里2016年校园招聘中的一道编程题目,涉及C++语言的序列点概念。代码在不同编译器上产生不同的结果,提示了C++中未定义的行为,即编译器可以自由决定参数计算的顺序,导致可能的不确定性。博客通过示例解释了逗号运算符、三元运算符和序列点的规则,并强调这个问题没有标准答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码是阿里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><
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值