user-0 提问: 求助，脑袋晕了，求查找如下不长代码问题

回复:
user: user-1
content: --i，i--的区别：前者是i先减1再运算，后者相反没如果不需要加减操作下表只需要使用i

user: user-2
content: 所以我说不要在判断条件中使用--操作，因为你这样写下来很乱，而且容易出现问题，且bug不易查找。 如果你基础扎实，并且代码经验丰富的话，推荐这样使用，因为可以减少很多代码量。 但是你在这里的--操作完全没有必要，增加了代码量，而且困扰了你自己。 #include <stdio.h> #define N 10 main() { 	float av, max = 0.0, min = 100.0, sum = 0, m; 	double a[N]; 	int i, j = 0; 	for (i = 0; i < N; i++) 	{ 		printf("please input %d=", i+1); 		scanf("%f", &m); 		if (m>max) max = m; 		if (m<min) min = m; 		sum += m; 		a[i] = m; 	} 	for (i = 0; i < N; i++) 	{ 		if (a[i] == max) 			printf("canceled %d's higest score %f\n", i+1, max);  		if (a[i] == min) 			printf("canceled %d's lowest score %f\n", i+1, min); 	} 	av = (sum - max - min) / 8; 	printf("Average score is %f\n", av); 	return 0; }

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 比如这一个语块： for (i = 1; i <= N; i++) { //比如进入这里i为1         if (a[--i] == max) { //但是最大值并不是a[0]，而在此处的判断本身就会对i自减                              //所以此时i=0，并且判断为假，进入下一个if判断             printf("canceled %d's higest score %f\n", i, max);             i++;         }         if (a[--i] == min) { //进入if，此时i为0，而判断语句对i又做了一次自减得到i为-1                             //然后判断a[-1]，这时访问就已经出现错误                             //然后是否会出现你所说的一直cancel-1就要看你输入的数据                             //以及在索引-1处内存本身就存在的值             printf("canceled %d's lowest score %f\n", i, min);             i++;         }     }

user: user-0
content: 引用 1 楼 Falleyes 的回复:不要在if判断中使用前置--，i为1进入判断，i就在判断中减1，但是判断不符合，跳到下一条判断，i再次减一，就在访问索引-1的元素了。 还是不懂... 是这里出现了问题了吗 for(i=1;i<=N;i++) {if (a[--i]==max) {printf("canceled %d's higest score %f\n",i,max); i++; 可能涉及到if的机理，至少表面上怎么看都是没有问题的。然而在debug，输入10个不等数据之后，程序陷入无限循环，一直不停输出“canceled -1‘s score ...".这里的-1搞不懂

user: user-0
content: 引用 5 楼 Falleyes 的回复:比如这一个语块： for (i = 1; i <= N; i++) { //比如进入这里i为1         if (a[--i] == max) { //但是最大值并不是a[0]，而在此处的判断本身就会对i自减                              //所以此时i=0，并且判断为假，进入下一个if判断             printf("canceled %d's higest score %f\n", i, max);             i++;         }         if (a[--i] == min) { //进入if，此时i为0，而判断语句对i又做了一次自减得到i为-1                             //然后判断a[-1]，这时访问就已经出现错误                             //然后是否会出现你所说的一直cancel-1就要看你输入的数据                             //以及在索引-1处内存本身就存在的值             printf("canceled %d's lowest score %f\n", i, min);             i++;         }     } 懂了，终于发现了问题所在了，无论是不是最大，i 都会进行自减，谢谢了！

user: user-4
content: # include <stdio.h> # define N 10  int main() {     float av, max = 0.0, min = 100.0, sum = 0, m;     double a[N];     int i, j = 0;     for (i = 0; i < N; i++) {         printf("please input %d=", i + 1);         scanf("%f", &m);         if (m > max)             max = m;         if (m < min)             min = m;         sum += m;         a[i] = m;     }     for (i = 0; i < N; i++) {         if (a[i] == max) {             printf("canceled %d's higest score %f\n", i + 1, max);         }         if (a[i] == min) {             printf("canceled %d's lowest score %f\n", i + 1, min);         }     }     av = (sum - max - min) / 8;     printf("Average score is %f\n", av);      return 0; }

user: user-4
content: #include <stdio.h> #define N 10 main() { 	float           av, max = 0.0, min = 100.0, sum = 0, m; 	double          a[N]; 	int             i, j = 0; 	for (i = 1; i <= N; i++) { // 要养成下标从0开始的思考习惯，即for (i = 0; i < N; i++) 		printf("please input %d=", i); // 这里printf("please input %d = ", i + 1)，即可以输出1到10 		scanf("%f", &m); 		if (m > max) 			max = m; 		if (m < min) 			min = m; 		sum += m; 		a[--i] = m; // --就不需要了，即a[i] = m; 		// i++;就不需要了 	} 	for (i = 1; i <= N; i++) { // 这里也是一样，下标要从0开始，就不会到处出现--++，能不晕么？ 		if (a[--i] == max) { 			printf("canceled %d's higest score %f\n", i, max); 			i++; 		} 		if (a[--i] == min) { 			printf("canceled %d's lowest score %f\n", i, min); 			i++; 		} 	} 	av = (sum - max - min) / 8; 	printf("Average score is %f\n", av); 	return 0; }

user: user-2
content: 不要在if判断中使用前置--，i为1进入判断，i就在判断中减1，但是判断不符合，跳到下一条判断，i再次减一，就在访问索引-1的元素了。