简要版答案: 大家都知道"++cnt"和"cnt++"的区别,那么在本题存在歧义的语句中,对于"++cnt"来说,编译器只能保证自加操作在“分号前”完成而不能保证其在“等号前”完成。也就是说"sum[cnt - 1] + x"的值可能先于"++cnt"操作的执行而被计算出来,具体的执行和计算顺序与编译器有关,所以称这条语句是存在歧义的。
进一步学习: C 序列点
祝同学们AK CSP-S :) By HIT-Mubuky
题目:AcWing128
#include <stack>
#include <cstdio>
#include <cstring>
template<typename T1, typename T2>
constexpr auto max(T1 a, T2 b) { return (a > b ? a : b); }
constexpr auto MAXN = 1000001;
std::stack<int> lef;
std::stack<int> rig;
int sum[MAXN], man[MAXN], cnt;
int main(void)
{
memset(man, 128, sizeof(man));
int q;
scanf("%d", &q);
for (int i = 1; i <= q; i++) {
char inp;
scanf("\n%c", &inp);
if (inp == 'I') {
int x;
scanf(" %d", &x);
lef.push(x);
sum[++cnt] = sum[cnt - 1] + x;
man[cnt] = max(sum[cnt], man[cnt - 1]);
}
else if (inp == 'D' && !lef.empty()) {
lef.pop();
cnt--;
}
else if (inp == 'L' && !lef.empty()) {
rig.push(lef.top());
lef.pop();
cnt--;
}
else if (inp == 'R' && !rig.empty()) {
lef.push(rig.top());
rig.pop();
sum[++cnt] = sum[cnt - 1] + lef.top();
man[cnt] = max(sum[cnt], man[cnt - 1]);
}
else if(inp == 'Q'){
int k;
scanf(" %d", &k);
printf("%d\n", man[k]);
}
}
return 0;
}
样例输入:
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2
样例输出:
2
3
提示1:可以尝试使用不同系统测试这段代码
答案将在8月25日公布
提示2:某一语句存在歧义
8月23日更新:
鉴于同学们复习时间宝贵,我将存在歧义的语句贴在下面,希望同学们能指出为什么这个语句存在歧义。
sum[++cnt] = sum[cnt - 1] + x;
共 4 条回复
我因为这个崩过
更新:8月24日 20:10 发布了答案
由于
=
运算符的右结合性,cnt
在整个表达式计算前自增与在计算=
左侧表达式前自增会得到不同的结果。(胡猜cnt-1与++cnt的执行顺序?(猜的