8月22日思考题:观察下面一段代码并指出其存在的问题

Mubuky 2022-08-22 19:37:26 2022-08-24 20:13:12

简要版答案: 大家都知道"++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 条回复

Star

我因为这个崩过

st[--top] = st[top] + st[top + 1];
Mubuky

更新:8月24日 20:10 发布了答案

Laffey

由于 = 运算符的右结合性,cnt 在整个表达式计算前自增与在计算 = 左侧表达式前自增会得到不同的结果。(胡猜

xing_ling

cnt-1与++cnt的执行顺序?(猜的