c언어관련 몇가지 질문

c언어관련 몇가지 질문

작성일 2004.07.26댓글 3건
    게시물 수정 , 삭제는 로그인 필요

그냥 간단한건데...저는 초보라서 너무 몰라서..

몇가지 질문을 같이 할께요...

1. c언어에서 예를들어 char a[1000];

이런식으로 배열을 선언하잖아요.

이걸 scanf()로 입력받을때 scanf("%c",&a); 라고 해야되는거 아닌가요?

scanf("%c",a); 라고 배우는데요. 왜 배열에서는 입력받을때 &를 안쓰나요?

2. 위의 질문과 비슷비슷한 내용인데요.

char a[1000]; 이런식으로 배열을 선언한다음에요.

gets(a);로 입력받은다음 printf("%c",a);라든지..

scanf("%c",a); 로 입력받고 puts(a); 이런식으로 출력 못 받나요?

gets,puts 와 scanf,printf는 각자 섞어서 못 쓰고 같이만 쓸수 있나요?

3. 대입연산자에 += -= *= /= 같은게 있잖아요.

a+=1 은 a=a+1 과 같은 의미라고 되어있는데요.

a=a+1이라고 그냥 쓰면되지,뭐 이렇게 더 복잡한걸 만들어놨죠?

그냥 입력하는 시간을 최소화 하기 위해서 저런식으로 줄여놓은건가요?

아니면 대입연산자를 특별히 쓰는 경우가 있나요? a=a+1이라는게

a+=1, a++ 등으로 표현이 가능하다니 어지럽네요;;

또 a++와 ++a의 차이는 뭔지;; 계산순서가 앞과 뒤로 다르다..정도로 알고있는데

알기 쉽게 설명 좀해주세요. a+=1,a=a+1,a++,++a 등, 이것들을 전체적으로..

차이점,공통점이라든지 쓰이는경우등 좀 가르쳐주시면 감사하겠습니다.



profile_image 익명 작성일 -

쉽게 설명해드리겠습니다.

 

1. 질문하신데로 a라는 배열을 선언합니다. 그러면 a라는 변수에는 실제로 그 배열이 시작되는 위치만을 가지고 있습니다. 1000이라는것은 초기화를 해준다는거지요. 즉 다시말하면, a라는 곳에서 5번째 떨어진만큼에 있는 데이터를 읽어온다는게 a[4](0부터 시작하므로..)라는거구요.. 그냥 a라고 하면 그 배열이 시작되는 위치를 저장합니다. 즉 a는 포인터 변수지요.(실제 사용되는 포인터 변수와는 다릅니다. 실제 사용되는 포인터 변수는 가리키는곳이 바뀔 수 있지만, a는 포인터 변수임에도 불구하고 가리키는 곳이 바뀔 수 없습니다.)

scanf함수를 보면.. 보통 우리는 아래와 같이 씁니다.

 

scanf("%d", &a);

 

이때, &가 의미하는것은 a변수의 주소를 말합니다. 나중에 배우시겠지만, c에서는 기본적으로 call by value형식으로 주기 때문입니다. 이부분만 해도 꽤 되기때문에 생략하겠습니다.

어쨌든 주소를 전달해주면 된다는건데.. a가 배열로 선언되어 있다면 그말은 아까말한데로 이미 배열의 시작되는 위치(주소)를 기억하고 있는겁니다. 따라서 그냥 a라고 써주면 됩니다.

 

2. gets(a)로 받은 다음에 printf("%c", a[0])과 같이 쓸 수 있습니다. 왜냐하면, gets안에 들어갈 수 있는걸로는 char* 형 인데요, 이것은 포인터 형입니다. 즉 주소값을 넘겨주면 되는데, 1번과 같이 a는 배열이 시작되는 주소값이 담겨져 있습니다. 그래서 a라고만 써주면 됩니다. printf("%c", a)가 안되는 이유는 a는 주소값입니다. 그런데 그걸 char형으로 출력을 하라고 하니까 안되는거지요. 차라리 printf("%d", a)를 해보시는게 이해가 더 빠르실껍니다. 주소값이 정수형식으로 출력이 되니까요.

gets와 같이 사용한다면.. printf("%s", a)이렇게 해주면 되구요. %s라는게 문자열을 출력해주는건데, a라는 주소로 가서 널문자를 만날때까지 문자를 출력해주는거거든요.

 

#include

void main()
{
 char a[1000];

 scanf("%c", a);
 printf("%c", a[0]);
}

 

scanf에 대한 예제 입니다.

위의 예제에 대해서 보시다싶이..

scanf("%c", a);가 안되는건 아닙니다. a는 배열이 시작되는 주소가 들어있다고 했지요?

그러므로 배열이 시작되는곳에 문자하나를 입력받아서 넣는다 이겁니다. a배열이 시작되는 주소에 있는건.. a[0]변수와 같으므로 a[0]변수에 글자 하나를 입력시킨다랑 똑같습니다.

printf에서는 문자 하나를 출력해주겠다.. 이거구요..

위에서 설명했듯이 printf("%c", a)라고 한다면 a에 있는 값은 주소값이므로 주소값이 문자로 바뀌고.. 그래서 이상한 쓰레기값이 나오게 되는거구요..

 

puts도 마찬가지로 인자형이 char*형입니다. 따라서 포인터 변수를 인자로 넘겨줘야되구요.

인자를 잘 맞춰준다면.. 같이 함수를 쓰더라도 전혀 상관이 없습니다.

이것은 포인터 개념을 잘 아셔야 될것같습니다.

 

3. 실제 프로그래밍을 하다 보면, 변수명을 a라고만 하지 않습니다. 예를들면, 오늘의 시간을 저장하는 변수가 있는데 그 값을 1증가시킨다면..

 

TodayTime = TodayTime + 1;

 

과 같이 해야겠지요?

이것은,

 

TodayTime = TodayTmie + 1;

 

과 같이 오타가 날 확률도 있고, 쓰기가 어렵습니다.

나중에 보시면 알겠지만, 변수명을 지을때 척 보고 알도록 지어야 되는데요,

(구구단 짤때는 이런거 필요 없습니다.. 하지만 프로그램이 커진다면 변수명은 딱 보고 알수 있게 지어야되지요)

이걸

 

TodayTime++; 또는 TodayTime += 1;

 

이렇게 해주면 오타가 날 확률도 적고.. 변수명 써줄때 안귀찮겠지요?

실제로 a = a + 1; 이렇게 코딩하셔도 전혀 상관 없습니다.

하지만 직접 해보시면 뼈저리게 느끼시겠지만.. a++;이 100배 편합니다..-_-

 

a++과 ++a의 차이를 좀 더 쉽게 설명해드리겠습니다.

 

b = a++;

b = ++a;

 

이렇게 두개가 있습니다.

처음껀..

 

b = a;

a = a + 1;

 

로 나눌 수 있구요, 두번째껀..

 

a = a + 1;

b = a;

 

로 나눌 수 있습니다.

즉 처음과 같이 ++가 나중에 붙으면 b에다 우선 a를 넣어주고 a값을 나중에 증가시킨다 이겁니다. 앞에 ++가 붙으면 우선 a값을 증가시키고 b에다 a값을 넣어준다 이거구요.

차이점/공통점이라 함은... =_=;

차이점이나 공통점을 딱 집어 얘기 하기가 힘드네요 =ㅁ=;

 

이해 안가시면 쪽지로..

쉽게 설명하려고 하긴 했습니다만~

profile_image 익명 작성일 -

먼저 답글 쓰신분이 잘 써주셨지만 3번질문에 대해 보충설명하겠습니다.

1. 배열은 자체가 주소이기때문에 &(주소) 연산자를 쓸 필요가 없습니다.

2. 이 내용은 제가 직접 테스트해보고 다시 수정해드리겠습니다.

3. a=a+1, a+=1, a++, ++a

이 네가지의 공통점은 a 값을 하나씩 증가시킨다는 것입니다.

a=a+1, a+=1 두개는 차이가 없는걸로 알고있습니다.

다만 소스를 간결하게 표현하기 위한것이고요.

a++, ++a 의 차이는 a값을 증가시킨다는 점은 같지만

코딩에 따라서 크게 차이가 날 수 있습니다. 또한 C 언어를 처음

공부함에 있어서 매우 중요한 부분이라고 할 수 있습니다.

예를 들어서 설명을 드리겠습니다.

int a = 0, b = 0;

이런식의 a 와 b 가 선언되어있다고 가정하겠습니다.

a++; 혹은 ++a; 둘중 어느 문장을 집어넣으셔도 a 의 값은 1이됩니다.

하지만 이런 문장이 있다고 가정하겠습니다.

b = ++a;
b = a++;

위 두문장을 각각 테스트 해보시면 차이를 느끼실겁니다.

첫번째 문장의 경우는 b 는 1 이 출력이 되고

두번째 문장의 경우는 b 는 0 이 출력이 됩니다.

물론 a 는 두경우 모두 1이 됩니다.

첫번째 문장은 a값을 먼저 증가시킨뒤에 b값에 a 값을 배정하는 것이고

두번째 문장은 a값을 먼저 b값에 배정한뒤 a값을 증가시키는 것입니다.

이해가 가셨는지요?

또한 a+=1, a++(++a) 의 차이를 굳이 말하자면

전자의 경우는 1이외의 값을 증가시킬수 있다는 것입니다.

a+=2 이렇게되면 a값은 2씩 증가가 되겠지만

후자의 경우는 오로지 1값만 증가가 됩니다.

이상 답변 이었고요. 더 궁금하신 것이 있으시면

[email protected] 으로 메일 주시기 바랍니다.

그럼 좋은하루 되세요 ^^

profile_image 익명 작성일 -

뭐..윗분들이 다 설명은 해 놓으셨지만...
질문자님의 이해를 돕기위해 좀더 보충하겠습니다.

c언어에서 문자를 받는것과 문자열을 받는 것은 차이가 있습니다.
문자열이라는 것은, 끝에 널값이 들어가 있는 문자들의 배열입니다.

예를 들어 a[10]이라는 배열을 선언한다면, a=&a[0]을 나타냅니다.
인덱스 없이 그냥 쓰는 배열이름 a는 &a[0]을 가리키는 상수라고 봐야 한다는 거죠. printf("this"); 라고 한다면 printf()문에는 "this"라는 문자열이 인수로 취급되는 것이 아닙니다. 이것은 컴파일러가 자동으로 배열을 생성합니다.

a[0]='t'
a[1]='h'
a[2]='i'
a[3]='s'
a[4]='\0'

이런식으로 끝에 널값을 추간한다음 배열을 생성합니다.
그리고 printf() 문에는 단지 &a[0] 값만 전달되는 겁니다. 그리고 널값이 있을때까지 읽어들이는 거죠. 함수끼리의 전달에서 배열이 그 자체가 전달되지는 않습니다. 단지 그 처음 주소값많이 전달될 뿐이죠.

1번 질문에서..scanf()문에서도 주소를 전달하는 겁니다. int a;
scanf("%d",&a)라면 scanf()함수에는, 키보드로부터 읽어들인 정수값을 a라는 변수의 주소에 저장하라...라는 말이 됩니다. 그러나 배열 char a[10] scanf("%s",a) 같은 경우 배열 이름 a가 &a[0]을 나타내므로 주소값이 이미 묵시적으로 쓰여져 있다고 생각하는 편이 맞습니다.

2번 질문에서, gets()나 printf()문이나 다른 함수들과 특별히 이 함수는 저 함수와 짝을 이뤄서 쓰여져야 한다. 라는 규칙같은것은 없습니다. 님이 함수에서 인수 전달과정을 좀더 공부하시면 아시겠지만...문자열을 취급하는것 대부분은 그 인수의 처음 주소값이 전달되는경우가 대부분입니다. 그러므로 서로 같은 주소값을 다루는 이상 다 똑같이 쓸수 있겠죠. 다만 님이 쓰시는 목적에 더 효율적인 것이 있다는 것이죠. 님이 목적하신 바에 따라 알맞은 것을 아무거나 골라 쓰면 됩니다.

3번 질문에서 a=a+1; 이라는 것보다는 a++ 이라는 표현이 기계어를 만들때 더 효율적으로 만든다고 알고 있습니다. 쓰기도 편하고요.

그리고 a++ 과 ++a 의 차이점은 이문장 혼자 쓰일때는 상관이 없습니다.
그러나 b=a++ 과 b=++a 라는 표현과 같이 치환문으로 쓰일때는 차이가 드러납니다. 먼저 치환을 한다음에 a를 증가시키느냐, a를 증가시킨다음에 치환을 하느냐의 차이입니다. ++a와 같이 변수앞에 ++이라는 기호가 오면 a를 먼저 증가 시키고 치환을 하지만, a++과 같이 변수뒤에 ++이라는 기호가 오면 치환을 먼저 한 다음에 a를 증가시킵니다.

c언어 관련 몇가지 질문입니다.

... 2번같은경우엔..음 뭐라고해야하나 perl이란 언어가 있습니다.c언어랑 구조가 좀 비슷한데.. 구문을 적다가 새로운 줄에서 #으로 시작하는 문장은 읽지 않습니다....

c언어 관련해서 몇가지 질문좀 할게요

1.재귀함수는 무엇이고 어떤 경우에 사용하면 좋을까요? 2.포인터의 장단점이 무엇이고 왜 필요할까요? 1. 함수 내에서 자기 자신(함수)을 호출하는 함수를 재귀함수라고...

c언어 관련 몇가지 질문요~

문자열 thank you를 %s형으로 출력해야되는데 공백두 있구 어떻게 해야될지 잘 모르겠어요 글구 \a를 이용해서 경고음이 발생하는 프로그램을...

c언어 관련 질문 몇가지 드립니다

c++하고 c#하고 다른점은 무었인가요? c++에서 만든 파일을 c#에서도 실행시킬수 있어요? c++에서도 폼을 띄울수 있을까요? 내공 100 걸개요 c++ 하고 c# 은 완전히 다른...

c언어 관련 질문입니다!!!!!! 제발...

c언어 관련 질문입니다!!!!!!!!! 1. 주석문에서 / , // 이거 두개의 차이는 도데체... 데이터 변수에서 작명하는 몇가지 법칙을 가르쳐주세요...ㅜㅜ 4. 마지막으로!!...

C언어에 대한 몇가지 질문

... 질문이나 들어주십시오... C언어는 window를 구성하는 기본적인 컴퓨터 언어로... 어셈블리어와 c언어는 기본으로 하셔야 하구요.. 해킹관련기술들을 배우셔야 할것...

C언어 독학 관련 교재 질문 드립니다

C언어 독학 관련 교재 질문 드립니다. 관련지식은 없습니다(필요하다면 인강도... 매번 질문 남기실때마다 학원 홍보글로 뿔이 나셨네요..ㅎ 생각하신 계획에서 몇가지...

C언어 프로그래밍 관련 질문

... 이렇게 질문드립니다 ㅡ 혼자공부하려면 일단 학교에서 배우고있는 C언어 책을 독학해서 한번 쭉 보는게... 그 출력 입력문들도 버퍼비우기등, 몇가지 작업이...

C언어 관련 몇몇 질문(포인터)

C언어 관련해서 궁금한게 몇가지 있습니다. &a의 의미가 a의 주소값을 의미하고... 2.1의 질문과 연관되어 int *p=&a의 의미는 무엇인가요?(전 int *p=&a를 p의...

C언어 포인트 관련 질문합니다 !!!

C언어 공부를 하는 학생입니다. 오늘 포인터 관련 공부를 하다가 모르는게 나와서 질문을 드릴게요... 먼저 아래 몇 가지 내용을 정확하게 이해를 하고 있어야...