C语言声明变量顺序会对程序执行的结果造成影响吗

C语言 码拜 8年前 (2016-06-05) 1052次浏览
本人在https://vijos.org/p/1001做这个题目的时候,提交代码出现了runtime error 错误。就用vs2013在本地调试,调试发现了一个有趣的现象,本人不修改程序的逻辑代码,仅仅是更改了变量的声明顺序,就使程序提交成功。假如说这类网站的编译器不一样,要求我们遵守相应d代码规范才可以提交成功的话,本人倒也可以理解。可是本人就在本地使用vs2013调试编译,其余的代码不变,仅仅是更改了变量的顺序,程序执行就出现了异常,这本人就不知道是什么原因了,莫非C语言在使用的时候,对变量的生命顺序有要求?希望C语言资深专家能够为本人解惑,本人先在这里谢谢大家了。
题目原题地址:https://vijos.org/p/1001
题目的样例输入时这样的:

4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

题目的样例输出

ChenRuiyi
9000
28700

下面给出程序代码,这段代码可以得到题目给出的样例输出(也可以在网上提交通过,但是这不是重点,本人不清楚为什么在vs2013下,程序不变,只改变变量顺序,程序就会异常):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){

	int a;
	int scholarshipTotal = 0;
	char firstName[20];
	int mostMoney = 0;
	char name[20];
	int countMoney = 0;
	char c;
	int scoreA = 0;
	int scoreB = 0;
	char isLeader;
	char isWestStu;
	int num = 0;
	int i = 0;
	int len = 0;


	scanf("%d", &a);
	while (a--){
		i = 0;

		while (" " != (c = getchar())){
			name[i++] = c;
		}
		scanf("%d%d %c %c%d", &scoreA, &scoreB, &isLeader, &isWestStu, &num);
		if (scoreA > 80 && num > 0){
			countMoney += 8000;
		}
		if (scoreA>85 && scoreB>80){
			countMoney += 4000;
		}
		if (scoreA>90){
			countMoney += 2000;
		}
		if (scoreA > 85 && isWestStu == "Y"){
			countMoney += 1000;
		}
		if (scoreB > 80 && isLeader == "Y"){
			countMoney += 850;
		}
		if (countMoney > mostMoney){
			//strcpy(firstName, name);
			mostMoney = countMoney;
			for (i = 0; i < strlen(name); i++){
				firstName[i] = name[i];
			}
			len = strlen(name);
		}
		scholarshipTotal += countMoney;
		memset(name, 0, strlen(name));
		countMoney = 0;
	}
	for (i = 0; i < len; i++){ printf("%c", firstName[i]); }
	printf("\n");
	printf("%d\r\n", mostMoney);
	printf("%d\r\n", scholarshipTotal);
	return 0;
}

接下来什么也不改变,只是把本人的变量顺序换成下面的这段程序就会异常:

/*
int a;
char name[20];
char c;
char firstName[20];
int scoreA = 0;
int scoreB = 0;
char isLeader;
char isWestStu;
int num = 0;
int countMoney = 0;
int mostMoney = 0;
int scholarshipTotal = 0;
int i = 0;
int len = 0;
*/
解决方案

40

编译器可能按声明变量顺序安排他们的位置,对字符串操作严重依赖在何处能找到字符串结束标志,假如没有,就用最近的”\0″,而它很可能是你上次赋值的其他变量的值的一部分。
建议这样改,在

while (" " != (c = getchar())){
            name[i++] = c;
        }

后面加上

name[i] = "\0";

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言声明变量顺序会对程序执行的结果造成影响吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)