집 >백엔드 개발 >C#.Net 튜토리얼 >C 언어 프로그래밍에서 흔히 발생하는 실수 모음
C 언어에서 흔히 발생하는 오류(repost)
C 언어의 가장 큰 특징은 강력한 기능, 쉽고 유연한 사용입니다. C로 컴파일된 프로그램은 다른 고급 언어만큼 구문 검사에 대해 엄격하지 않으므로 프로그래머에게 "유연성의 여지"가 있습니다. 그러나 이러한 유연성은 특히 C 언어를 배우는 초보자에게 프로그램 디버깅에 많은 불편을 초래합니다. 어디서 잘못됐는지조차 모르는 실수를 합니다. 잘못된 프로그램을 보다가 어떻게 고쳐야할지 모르겠어서 C를 공부하면서 C프로그래밍에서 흔히 발생하는 실수들을 모아서 참고용으로 썼습니다.
1. 식별자를 작성할 때 대문자와 소문자의 차이를 무시하세요.
main()
{
int a=5;
PRintf("%d",A);
}
컴파일러는 a와 A를 두 개의 다른 변수 이름으로 간주합니다. 오류 메시지가 표시됩니다. C에서는 대문자와 소문자를 서로 다른 문자로 간주합니다. 가독성을 높이기 위해 기호 상수 이름은 대문자로, 변수 이름은 소문자로 쓰는 것이 관례입니다.
2. 변수의 유형을 무시하고 잘못된 연산을 수행하는 경우.
main()
{
float a,b;
printf("%d",a%b);
}
%는 나머지 연산으로 a/b를 가져옵니다. 정수 나머지. 정수 변수 a와 b는 나머지 연산을 수행할 수 있지만 실제 변수는 "나머지" 연산을 수행할 수 없습니다.
3. 문자 상수와 문자열 상수를 혼동하세요.
char c;
c="a";
여기서 문자 상수와 문자열 상수를 혼동합니다. 문자 상수는 작은따옴표 쌍으로 둘러싸인 단일 문자이고, 문자열 상수는 작은따옴표 쌍입니다. 따옴표. 큰따옴표로 묶인 일련의 문자입니다. C에서는 ""가 문자열의 끝 표시로 사용된다고 규정합니다. 이는 시스템에 의해 자동으로 추가되므로 문자열 "a"에는 실제로 'a'와 ''라는 두 문자가 포함되어 있으며 이를 문자 변수에 할당하는 것은 아닙니다. 일.
4. "="와 "=="의 차이를 무시하세요.
많은 고급 언어에서 "=" 기호는 관계 연산자 "같음"으로 사용됩니다. 예를 들어 BASIC 프로그램에서는
if (a=3) then...
이라고 쓸 수 있습니다. 그러나 C 언어에서는 "="는 할당 연산자이고 "=="는 관계 연산자입니다. 예를 들면 다음과 같습니다.
if (a==3) a=b;
전자는 a가 3인지 비교하는 것이고, 후자는 a가 3이면 b의 값을 다음에 할당한다는 의미입니다. 에이. 초보자들은 습관 때문에 이런 실수를 저지르는 경우가 많습니다.
5. 세미콜론을 추가하는 것을 잊었습니다.
C문에서 세미콜론은 빼놓을 수 없는 부분이며,문의 마지막에는 반드시 세미콜론이 와야 합니다.
a=1
b=2
컴파일할 때 컴파일러는 "a=1" 다음에 세미콜론을 찾지 못하므로 다음 줄 "b=2"를 이전 줄의 일부로 사용합니다. 구문 오류가 발생합니다. 오류를 수정할 때 가끔 오류를 지적한 줄에 오류가 발견되지 않는 경우 이전 줄에 누락된 세미콜론이 있는지 확인해야 합니다.
{ z=x+y;
t=z/100;
printf("%f",t);
}
복합문의 경우 마지막 세미콜론은 무시할 수 없습니다. (파스칼과는 다릅니다.)
6. 세미콜론을 더 추가하세요.
복합문의 경우:
{ z=x+y;
t=z/100;
printf("%f",t);
};
복합 명령문의 중괄호 뒤에 세미콜론을 추가하면 안 됩니다. 그렇지 않으면 불필요해집니다.
또 다른 예:
if (a%3==0);
I++;
3이 a를 나누면 1을 더하는 것입니다. 그러나 if(a%3==0) 뒤에 추가 세미콜론이 있으므로 if 문은 여기서 끝나고 프로그램은 3이 a를 나누는지 여부에 관계없이 자동으로 1씩 증가합니다.
또 다른 예:
for (I=0;I
원래 의도는 5개의 숫자를 차례로 입력한 후 각 숫자가 입력된 후 출력하는 것입니다. for() 뒤에 세미콜론이 추가되므로 루프 본문은 빈 명령문이 됩니다. 이때 하나의 숫자만 입력 및 출력할 수 있습니다.
7. 변수 입력 시 주소 연산자 "&"를 추가하는 것을 잊었습니다.
int a,b;
scanf("%d%d",a,b);
이것은 불법입니다. Scanf 함수의 기능은 a와 b의 주소에 따라 a와 b의 값을 메모리에 저장하는 것입니다. "&a"는 메모리에 있는 a의 주소를 나타냅니다.
8. 데이터 입력 방식이 요구사항을 충족하지 않습니다. ①scanf("%d%d",&a,&b);
입력 시 쉼표를 두 데이터 사이의 구분자로 사용할 수 없습니다. 예를 들어 다음과 같은 입력은 올바르지 않습니다.
3, 4
데이터를 입력하려면 두 개의 데이터를 하나 이상의 공백으로 구분하고 Enter 키와 Tab 키를 사용할 수도 있습니다.
②scanf("%d,%d",&a,&b);
C 규정: "형식 제어" 문자열에 형식 설명 외에 다른 문자가 있는 경우 이 문자는 동일합니다. 문자. 다음 입력은 유효합니다:
3, 4
현재 쉼표 대신 공백이나 다른 문자를 사용하는 것은 올바르지 않습니다.
3 4 3:4
또 다른 예:
scanf("a=%d,b=%d",&a,&b);
입력은 다음 형식이어야 합니다.
a= 3,b=4
9. 입력 문자의 형식이 요구 사항과 일치하지 않습니다.
"%c" 형식으로 문자를 입력할 경우 "공백문자"와 "이스케이프 문자"가 모두 유효한 문자로 입력됩니다.
scanf("%c%c%c",&c1,&c2,&c3);
a b c를 입력하면
문자 "a"는 c1로 전송되고 문자 " "는 c2, 문자 "b"가 전송됩니다. c3을 지정하세요. %c는 한 문자만 읽어야 하고 두 문자 사이의 간격으로 공백을 사용할 필요가 없기 때문입니다.
10. 입력 및 출력 데이터 유형이 사용된 형식 지정자와 일치하지 않습니다.
예를 들어 a는 정수형으로 정의하고 b는 실수형으로 정의했습니다.
a=3;b=4.5;
printf("%f%d ",a,b);
컴파일 중에는 오류 메시지가 표시되지 않지만 실행 결과는 원래 의도와 일치하지 않습니다. 이런 종류의 오류에는 특별한 주의가 필요합니다.
11. 데이터를 입력할 때 정확성을 지정하도록 노력하세요.
scanf("%7.2f",&a);
이는 불법이며 데이터 입력 시 정확성을 지정할 수 없습니다.
12. switch 문에는 break 문이 생략되어 있습니다.
예: 시험 점수 등급에 따른 백분율 세그먼트를 인쇄합니다.
스위치(등급)
{ 케이스 'A':printf("85~100 ");
케이스 'B':printf("70~84 ");
케이스 'C': printf("60~69 ");
case 'D':printf("<60 ");
default:printf("error ");
break 문이 없어 Case만 해당 판단이 아닌 라벨 역할을 합니다. 따라서 grade 값이 A인 경우 printf 함수는 첫 번째 문을 실행한 후 두 번째, 세 번째, 네 번째, 다섯 번째 printf 함수 문을 실행합니다. 이를 작성하는 올바른 방법은 각 분기 뒤에 "break;"를 추가하는 것입니다. 예를 들어
case 'A':printf("85~100 ");break;
13. while 문과 do-while 문 사이의 세부 사항 차이를 무시합니다.
(1)main()
{int a=0,I;
scanf("%d",&I);
while(I<=10)
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
while(I<=10);
printf("%d",a);
}
입력 I의 값이 다음보다 작거나 같을 때를 볼 수 있습니다. 10, 2 얻은 결과는 동일합니다. I>10이면 결과가 달라집니다. while 루프가 먼저 결정된 후 실행되기 때문에 do-while 루프가 먼저 실행된 후 결정됩니다. 10보다 큰 숫자의 경우 while 루프는 루프 본문을 한 번 실행하지 않지만 do-while 문은 루프 본문을 한 번 실행합니다.
14. 배열 정의 시 변수의 오용.
int n;
scanf("%d",&n);
int a[n];
대괄호로 묶인 배열 이름은 상수 표현식이며 상수와 기호를 포함할 수 있습니다. 끊임없는. 즉, C에서는 배열 크기의 동적 정의를 허용하지 않습니다.
15. 배열을 정의할 때 정의된 "요소 수"를 사용할 수 있는 최대 첨자 값으로 착각합니다.
main()
{static int a[10]=;
printf("%d",a[10]);
}
C 언어 규정: 정의할 때 a[ 사용 10], 이는 배열 a에 10개의 요소가 있음을 나타냅니다. 아래 첨자 값은 0부터 시작하므로 배열 요소 a[10]이 존재하지 않습니다.
16. 어레이 초기화 시 정적 저장소는 사용되지 않습니다.
int a[3]=;
이렇게 배열을 초기화하는 것은 잘못된 것입니다. C 언어에서는 정적 저장소(static) 배열과 외부 저장소(exterm) 배열만 초기화할 수 있다고 규정합니다.
static int a[3]=;
17로 변경해야 합니다. 주소 연산자 &가 추가되어서는 안 되는 곳에 주소 연산자 &가 추가됩니다.
scanf("%s",&str);
C 언어 컴파일 시스템은 배열 이름을 다음과 같이 처리합니다. 배열 이름은 배열의 시작 주소를 나타내며, scanf 함수의 입력 항목은 문자 배열입니다. 이름이 아닌 주소 문자를 추가하고 필요한 경우.
scanf("%s",str);
으로 변경해야 합니다. 18. 함수의 형식 매개변수와 지역 변수는 동시에 정의됩니다.
int max(x,y)
int x,y,z;
형식 매개변수는 함수 본문 외부에서 정의해야 하고, 지역 변수는 함수 본문 내부에서 정의해야 합니다. 다음으로 변경해야 합니다:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z) ;
}
위 내용은 C 언어 프로그래밍에서 흔히 발생하는 실수를 모아놓은 것입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!