프로그래밍 언어에서는 평가(evaluate)라는 개념이 있어. 모든 변수나 식은 사용되는 지점에서 평가를 하게 되어 있고 그 역할이 동등해.
예를 들면 a = 50;이라고 하면 단순히 a에 (int) 50을 넣는다는건 '부가적인' 효과임.
실제론 오른쪽의 값은 (int) 50으로 평가되고 대입 연산자에 의해서 a도 같은 (int) 50으로 평가되게 됨.
return a1의 경우는 a1을 평가해서 그 값을 return 지시문에 의해서 반환하는 것.
return a + b;도 마찬가지로 +연산자에 의해서 a + b가 어떠한 값으로 평가되고 return은 그 평가값을 반환함.
a > b 같은 것 역시 a를 평가하고 b를 평가해서 >가 이를 비교해서 a가 크면 1(true)를 평가하는것.
즉 어떤 상황에서도 동일하게 평가될 수 있는 값이라면 똑같이 대체가능한 거지.
sum 함수에서 int sum(int a, int b) { int c; c = a + b; return c; } 라면(옆에 한줄로 되어 있는데 ;다음에 엔터쳐서 줄 바꾼거랑 동일해) c=a+b를 통해서 c와 a+b는 a, b가 무슨 값을 갖든 동일한 타입의 동일한 평가값을 갖는것을 알 수 있지? 그럼 대체 가능한거야.
2번의 경우도 각 부분에서 평가되는 시점이 다르다는 것을 생각하면 이해가 가지.
전에 대입 연산자 = 는 오른쪽에서 왼쪽으로 판단한다고 했던거 기억나지?
x = x + b가 있다면 x + b를 먼저 평가(당연히 그러면 오른쪽에 있는 x와 b를 제일 먼저 평가하고 + 연산의 결과를 평가 하겠지?)하고 나서 =연산자를 통해 최종적으로 왼쪽의 x를 평가하게 되지. 우측의 x와 왼쪽의 x가 평가받는 시점이 다르기 때문에 수학식과 달리 성립이 가능해.
이전 글에 함수 없이 구현한 식을 다시 보면 sum = sum + num;이란 식을 너도 이미 썼듯이.
만약 반대로 어떠한 식을 여러번 또는 추가로 가공해서 써야 하거나 (예를 들면 a*b의 값을 한 함수 안에서 여러번 호출해서 써야 할 때) 그 값이 명확하게 어떤 의미를 갖는지를 코드상에서 명확하게 보여주고 싶다면 반대로 일부러 변수명을 하나 사용해서 할당할 수도 있지.
예를 들면 전기요금 계산을 할때 a가 사용시간 b가 (시간당)소비량이고 이를 곱한 값 a*b가 전력량인 것을 명확하게 보여주고 싶고 그 전력량을 다시 전기요금 계산식에도 쓰고 출력에도 쓰고... 하는식으로 여러곳에 쓰인다면 변수 int usedPower 같은 변수를 별도로 선언해서 usedPower = a * b;로 대입시키고 그다음에는 usedPower를 가져다 쓰는 방식을 쓸 수도 있는거지. 그럼 변수하나만큼의 메모리는 더 차지해도 a*b라는 연산을 여러번 하는 불필요한 연산이 줄어들고 그 값이 사용한 전력량이라는 의미도 쉽게 보일테니까.
빠리빨리
그냥 return (a1+x) 해주면될듯
글구 함수를 만들고싶으면 변수 a1 a2받아서 a1부터 a2까지 더하는 그런함수를 만들고 메인에서는 값만 받아오는 식의 그런함수가 더 좋을거같네
그림으로말해요
그러니까 그런함수를 어떻게 표현해야될까
빠리빨리
일단 반복문을 함수로 옮기고
a1부터 a2까지 더한값을 한 변수에 저장한 다음에
계산 완료후 그 값을 리턴시켜주면 되겠지
메인에서는 함수 호출해서 받은 값을 출력만하면 될테고
그림으로말해요
니말은 for 이부분을 함수로 옮기고
메인 부분은 호출만 시켜라 이말임?
그렇게하면 너무 코드가 복잡해질거같은데
간결하게 표현하는법 없을까 ?
빠리빨리
워낙 간단한 구조라 코드가 복잡하지는 않을거고
밑에 댓글에도 있는데 같은역할을 하는 변수들이 많아서 지금 복잡하게 보이는거임
어떻게 정리할지는 한번 생각해봐
구백육
그림으로말해요
수식을 미리 정의하고
반복문의 내용은 미리 정의한 함수를 쓰는거지
알파스트라이크
바꾸고 싶은 방향을 제시해줘야 답변이 가능할 것 같다만.
일단 변수가 필요없이 많이 선언된 것을 줄일 수 있어
1.함수 Sum의 경우 내부에 연산용 변수 an이 필요하지 않음.
sum(int a, int b)
{
return a + b;
}
를 해도 동일한 결과를 얻을 수 있지
2. 메인 함수 안에 선언된 변수들도 일부 줄일 수 있지.
x와 c는 보면 알겠듯이 사실상 한쪽이 받고 그다음 쪽으로 넘겨주는 역할만 하고 있어
x가 sum안에 들어가서 나온 값을 c가 받아서 x로 전해주고 그 x는 다시 다음 루프에서 sum 안에 들어가고...반복
바꿔말하면 x와 c가 하나여도 문제가 없지.
x = sum(a1, x);로 바꿔도 문제가 없어.
3. 그리고 프로그래밍 변수 이름 지을 때
3번째 줄 Sum함수 선언에서 쓰인 매개변수 a1, x와
main함수 안에서 이 Sum함수를 사용하면서 전달인자로 int a1와 int x를 사용했는데 이 둘을 서로 같은 이름으로 붙일 필요는 없고 괜히 로컬변수 범위 확인하는데 헷갈릴 수 있으니 아예 다른 변수명으로 붙이는게 더 좋음.
다른 방향으로 바꾸길 원하는거면 어떤 방향을 원하는지 댓글로 달아줘.
사실 sum 함수가 하는게 a와 b를 더하는 것 밖에 없는 간단한 함수니 다른 방법으로
for루프 돌리는 블럭부분 자체를 아예 함수로 빼는 방법도 있을 수 있지.
total_sum(int a, int b) 형태로 선언해서 a에서 b까지 모든 정수를 더하는 결과를 리턴하는 식으로.
그러면 1~100만 계산하는게 아닌 50~200 같은 다른 범위에도 쓸 수 있는 함수를 만들 수 있는거지.
그런건 진짜 만들기 나름이고 그런 구조를 생각하는게 프로그래밍이지. 여러가지 방향과 방법이 있으니 여러가지로 시도해봐
그림으로말해요
1번은 꼭 수식을 어떤 한 변수에 지정할 필요가 없구나
난 꼭 수식이면 무조건 어떤 변수에 지정해야되는줄암
2번도 x = a1+x 는 일반 수학 수식으로 볼때 말이 안되는 식인데
a1+x를 더한게 다시 x가 된다 이런 사고가 부족했던거같음
많은도움됐음
귀여운알파
C에서, 우변의 계산이 완료된 후에 그 값이 좌변의 변수에 업데이트 된다.
알파스트라이크
프로그래밍 언어에서는 평가(evaluate)라는 개념이 있어. 모든 변수나 식은 사용되는 지점에서 평가를 하게 되어 있고 그 역할이 동등해.
예를 들면 a = 50;이라고 하면 단순히 a에 (int) 50을 넣는다는건 '부가적인' 효과임.
실제론 오른쪽의 값은 (int) 50으로 평가되고 대입 연산자에 의해서 a도 같은 (int) 50으로 평가되게 됨.
return a1의 경우는 a1을 평가해서 그 값을 return 지시문에 의해서 반환하는 것.
return a + b;도 마찬가지로 +연산자에 의해서 a + b가 어떠한 값으로 평가되고 return은 그 평가값을 반환함.
a > b 같은 것 역시 a를 평가하고 b를 평가해서 >가 이를 비교해서 a가 크면 1(true)를 평가하는것.
즉 어떤 상황에서도 동일하게 평가될 수 있는 값이라면 똑같이 대체가능한 거지.
sum 함수에서 int sum(int a, int b) { int c; c = a + b; return c; } 라면(옆에 한줄로 되어 있는데 ;다음에 엔터쳐서 줄 바꾼거랑 동일해) c=a+b를 통해서 c와 a+b는 a, b가 무슨 값을 갖든 동일한 타입의 동일한 평가값을 갖는것을 알 수 있지? 그럼 대체 가능한거야.
2번의 경우도 각 부분에서 평가되는 시점이 다르다는 것을 생각하면 이해가 가지.
전에 대입 연산자 = 는 오른쪽에서 왼쪽으로 판단한다고 했던거 기억나지?
x = x + b가 있다면 x + b를 먼저 평가(당연히 그러면 오른쪽에 있는 x와 b를 제일 먼저 평가하고 + 연산의 결과를 평가 하겠지?)하고 나서 =연산자를 통해 최종적으로 왼쪽의 x를 평가하게 되지. 우측의 x와 왼쪽의 x가 평가받는 시점이 다르기 때문에 수학식과 달리 성립이 가능해.
이전 글에 함수 없이 구현한 식을 다시 보면 sum = sum + num;이란 식을 너도 이미 썼듯이.
알파스트라이크
만약 반대로 어떠한 식을 여러번 또는 추가로 가공해서 써야 하거나 (예를 들면 a*b의 값을 한 함수 안에서 여러번 호출해서 써야 할 때) 그 값이 명확하게 어떤 의미를 갖는지를 코드상에서 명확하게 보여주고 싶다면 반대로 일부러 변수명을 하나 사용해서 할당할 수도 있지.
예를 들면 전기요금 계산을 할때 a가 사용시간 b가 (시간당)소비량이고 이를 곱한 값 a*b가 전력량인 것을 명확하게 보여주고 싶고 그 전력량을 다시 전기요금 계산식에도 쓰고 출력에도 쓰고... 하는식으로 여러곳에 쓰인다면 변수 int usedPower 같은 변수를 별도로 선언해서 usedPower = a * b;로 대입시키고 그다음에는 usedPower를 가져다 쓰는 방식을 쓸 수도 있는거지. 그럼 변수하나만큼의 메모리는 더 차지해도 a*b라는 연산을 여러번 하는 불필요한 연산이 줄어들고 그 값이 사용한 전력량이라는 의미도 쉽게 보일테니까.
그림으로말해요
그러니까 한마디로
int a;
int b;
int usedPower = a*b;
이럴 필요없이
_____________\
int usedPower;
usedPower = a*b;
해버리면 된다는거네
usedPower을 이미 정수로 지정했으니
a*b도 정수여야하니까
굳이 a,b를 인트써서 정수로
지정해놓을 필요가 없네
이 뜻 맞음?
알파스트라이크
그건 아니지 모든 변수는 사용하려면 그 앞에 선언을 해 줘야지. 내 말은
int a;
int b;
.
.
printf("%d\n", a*b);
형태로 쓰나
int a;
int b;
int usedPower;
usedPower = a * b;
printf("%d\n", usedPower);
형태로 쓰나 기본적으론 같은데 만약 저 a*b의 값을 여러번 쓰거나 할 거면 후자를 선택하는게 장점이 생긴다는 거. 그냥 한번 쓰고 말거면 a*b만 쓰는게 편할 수 있고 간단하지만 '재활용'을 하거나 '가독성'을 위해서 후자를 선택하는게 나은 경우가 있다 이거임.
뭐 이런건 이렇게 해야 된다 같은 법칙이라기 보단 팁 같은거고 계속 프로그래밍 익혀나가다 보면 자연스럽게 체득하게되는 부분이니 지금 당장은 가볍게 흘려도 큰 문제는 없음.
그림으로말해요
ㅇㅇ 이해됨
답변해줘서 고마워
알파스트라이크
열공 화이팅
귀여운알파
그냥 니말은 Sum(100)하면 5050이 나오게 하고싶다 이건가? 그러면 재귀 써야지 뭐
int Sum(int endnum)
{
if(endnum == 1)
return 1;
else
return (endnum + Sum(endnum - 1);
}
센타까
함수를 만들고 싶은거야? 아니면 뭔가 간단하게 하고 싶은거야?
int main()
{
int a = 100, sum = 0;
while(a)sum+=a--;
printf("%d", sum);
return 0;
}
간단하게 하려면 이런 방법도 있어.
그림으로말해요
ㅇㅇ 내가 원하는 답변임
어떻게 하면 다른식으로 표현할까
최대한 간결하게
근데 이해안되는 부분이
int형 함수써서 0될때까지 값 받아서
더한다 이뜻인거같은대
while(a)sum+=a--
이부분이 이해안됨
그리고 마지막에
return 0은 왜씀??
센타까
while(a)는 a가 0이 아니라면 아래를 반복
sum에 a를 더하고 a를 1 줄인다.
a가 0이 되면 루프를 벗어남. -> 1부터 100까지가 아니라 100부터 1까지 더한거지.
리턴은 main 함수 기본 생성값이 int func()라서 그냥 리턴한거야. 정상 종료했다고. void로 선언하면 워닝뜬다.
그림으로말해요
1. main과 void의 차이점좀
그리고 위 코딩에서
왜 void 쓰면 안되는지좀 알려줘라
2. while(종결조건)
인데 그냥 while(a)만 하면
a가 뭔지 알고 끝남?
while(a=0) 이래야 되지 않음?
3. a+=b가
a에 b를 더한다 이거임?
센타까
void main()과 int main()은 OS에서 시키는 대로 지정하는게 옳아. 윈도우 위에서 돌아가면 0을 리턴해야 정상 종료했다고 윈도우한테 보고하는거지. 난 OS 없이 프로그램 하는 경우 - MCU계열 - 가 많아서 void main(void)를 주로 쓴다.
while(a) 는 while(a == 0)과 정확히 동일한 동작을 한다.
이건 익숙해지면 생각할 필요도 없이 자주 쓰여. 물론, 시인성을 위해 일부러 a == 0이라고 넣어주는 경우도 있긴 하다.
a+=b를 풀어 쓰면 a = a + b다. 이것도 정확히 동일한 동작을 한다. 그냥 C 언어의 다른 표현일 뿐이야.
팝콘파프콘
while은 괄호안에 조건식이 참일때만 실행되니까
a가 100에서 1까지 점점 줄어들면서 sum에 더해지다가
a가 0되는순간 while 벗어나고 sum은 5050로 연산 끝남
마지막 return 0; 은 int main()에 대한 return값
잘못이해하고있는거 같은데 int a=100; 은 함수가 아니라 int 변수a를 선언한거고
저기서 return 0; 은 int main()에 대한 리턴값이얍
그림으로말해요
a+=b하고
a=+b의 차이점좀
팝콘파프콘
https://studyc.tistory.com/5
여기 드가서 할당연산자 보면 +=가 나옴
쉽게 생각해서 구분하기쉽게 a-=b; 랑 a=-b; 를 비교하면
첫번째거는 a값에서 b값을 빼서 a에 다시 대입하는거고
두번째꺼는 그냥 b의 음수값을 그대로 a에 넣는거임
그림으로말해요
질문하나만 해도됨?
니가 말한코딩에서
맨처음부터
int main()
이렇게 시작하는데
왜 int main() 으로 시작하는거야?
void main()
이걸로 시작하면 안됨?
int main() 과 void main()의 차이점좀
알려줄 수 있어?
팝콘파프콘
https://blog.naver.com/tipsware/221243513396
이거 읽는게 도움될거같아
실제로 난 컴공 전공자가 아니라 학부 교양으로 2학기정도 수강했었고 그때는 나도 void main썼었거든
근데 주변 컴공친구들이 비전공자한테는 상관없지만 int main하고 return 0; 이 맞는거라고 글케 쓰라고하더라구
첨엔 return 0; 쓰는게 귀찮아서 걍 void main 썼는데 쓰다보니까 별 상관없는듯 ㅋㅋㅋ
첨부터 습관 int main으로 들여바바
잉텔
그냥 등비 수열 합 쓰면 안되냐?
음음
(n*(n+1))>>1