求助!为什么用c++(Clang)编译器才能过,用其他的过不了?

xx 2019-08-19 16:57:44 2019-08-20 20:47:34

题目:10606 小型计算器

我的代码

#include<bits/stdc++.h>
using namespace std;
//#define DEBUG
int arr[30][100];//数组
int var[30];//变量
void gint_do(){
	char ch1,ch2,sym;
	int num1,num2;
	int *site1=NULL,*site2=NULL;
	int arr1=0;
	int arr2=0;
	ch1=getchar();
	while((ch1>'Z' || ch1<'A') && (ch1>'z' || ch1<'a')) ch1=getchar();
	#ifdef DEBUG 
		printf(" --ch1=%c\n",ch1);
	#endif
	if(ch1>='a' && ch1<='z') scanf("%d",&num1),arr1=1;
	#ifdef DEBUG 
		printf(" --num1=%d,arr1=%d\n",num1,arr1);
	#endif
	getchar();
	sym=getchar();
	#ifdef DEBUG 
		printf(" --sym=%c\n",sym);
	#endif
	getchar();
	ch2=getchar();
	while((ch2>'Z' || ch2<'A') && (ch2>'z' || ch2<'a') && (ch2>'9' || ch2<'0')) ch2=getchar();
	#ifdef DEBUG 
		printf(" --ch2=%c\n",ch2);
	#endif
	if(ch2>='a' && ch2<='z') scanf("%d",&num2),arr2=1;
	else if(ch2<='9' && ch2>='0'){
		num2=ch2-'0';
		arr2=2;
		ch2=getchar();
		while(ch2<='9' && ch2>='0') num2=num2*10+ch2-'0',ch2=getchar();
	}
	#ifdef DEBUG 
		printf(" --num2=%d,arr2=%d\n",num2,arr2);
	#endif
	if(arr1==0) site1=&var[ch1-'a'];
	else site1=&arr[ch1-'A'][num1];
	if(arr2==0) site2=&var[ch2-'a'];
	else if(arr2==1) site2=&arr[ch2-'A'][num2];
	else site2=&num2;
	switch(sym){
		case '=':*site1=*site2;break;
		case '+':*site1+=*site2;break;
		case '-':*site1-=*site2;break;
		case '^':*site1^=*site2;break;
	}
	#ifdef DEBUG 
		printf("\t\t\t-> ",ch1);
	#endif
	printf("%d\n",*site1);
}
int main(){
	#ifdef DEBUG 
		freopen("in.txt","r",stdin);
	#endif
	int n;
	cin>>n;
	getchar();
	for(int i=1;i<=n;i++){
		gint_do();
		#ifdef DEBUG 
		printf("#%d End.\n",i);
		#endif
	}
	#ifdef DEBUG
	printf("\nThe End!");
	#endif
	return 0;
}

测试数据

输入

6
A = 1
B = A
c12 + 123
d31 - 15
d31 ^ c12
A = d31

输出

1
1
123
-15
-118
-118

我的问题

为什么我用c++11(Clang) 编译器可以过,用其他编译器只对了测试点2,用NOI编译器连测试点2都过不了,还Runtime Error?

共 3 条回复

xx

好的,谢谢老师,改对了

mulab

你的程序中包含很多可能合法的空间,数组越界会访问本来不属于这个数组的空间,如果:

  • 越界到了属于你程序其他变量的空间,但是是程序其他部分也用到了这段空间,那么别的变量就被你改乱了,有可能会出现奇怪的错误,比如WA、RE等。
  • 越界到了属于你程序其他变量的空间,但碰巧程序的其他部分又没有访问到这段空间(比如这道题大多数组变量其实是不会用到的),那么你可能很幸运地通过测试点。
  • 越界到了不属于你程序的空间,程序会RE。

但是具体是哪种情况,不同的编译器在不同的环境下为每个数组开的空间位置是可能不一样的,甚至可能同一个编译器在操作不时间运行都不一样。

另外,每道题目是有相应的讨论区的。像这种具体题目的提问可以到这个题的讨论区,而不是在全局板块提问。

mildjack
  1. 首先,同学你的指针掌握的很不错。需要注意的是,提问的时候要说明题号哦,或者建议直接到对应题目的讨论区提问
  2. 你的代码错在这里,大小写处理反了,改了就能AC:
if(arr1==0) site1=&var[ch1-'a'];
else site1=&arr[ch1-'A'][num1];
if(arr2==0) site2=&var[ch2-'a'];
else if(arr2==1) site2=&arr[ch2-'A'][num2];
  1. RE的原因是你大小写处理反了以后数组越界了,目前为止你们的大多数RE应该都是数组越界, DEBUG 可以从这个方面入手。
  2. 至于为什么 Clang 能过,我也不太清楚不同编译器之间的细节区别,如果其他老师了解这方面内容,会过来答复你。不过这不是学习重点,以后用 C++ 编译器或 NOI 编译器就行,如果不能通过也没必要尝试别的编译器,因为正式考试的编译环境是给定的。