for문 조건변화수식 질문

byflashh의 이미지

int sum = 0;
int num;

for(num=1; 5>=num; num++){
sum=sum+num;
}
printf("%d", sum);

여기서 조건변화수식인 num++을 ++num으로 써야하는거 아닌가요?

저 for문 돌아가는 순서가
num=1로 시작
num이 5보다 작거나 같으니 명령문 수행
sum=sum+num이니까
0=0+1
그다음 num++수행인데
여기서 num++은 수식 계산후 동작이지않습니까?
그러면 여기서 num++은 이제야 처음으로 동작하는것이니 num에 1이 한번더 들어간후 +1이 되야되는거 아닙니까?

라스코니의 이미지

한번 돌려보시면 되지 않을까요? num++로도 해보시고 ++num 으로도 해보시고요.
어떤 결과가 나오는가요?

DarkSide의 이미지

논리적으로는 ++num 이 빠르다고 하는데, 컴파일러 최적화로 인해 같은 속도가 나온다고 하는군요.

익명 사용자의 이미지

Quote:
여기서 num++은 수식 계산후 동작이지않습니까?
그러면 여기서 num++은 이제야 처음으로 동작하는것이니 num에 1이 한번더 들어간후 +1이 되야되는거 아닙니까?

밑줄친 부분이 무슨 말인지 모르겠군요.

라스코니님 말씀대로, ++num을 넣으나 num++을 넣으나 똑같이 잘 동작하는 올바른 코드입니다. 직접 해보면 금방 알 수 있지요.

그리고 주어진 코드와 같은 맥락에서 ++num과 num++이 서로 다른 성능을 보이는지는 기초 프로그래밍 분야의 만년 떡밥입니다. 결론부터 말하면 int와 같은 primitive type에 대해서는 전혀 차이가 날 일이 없으니 신경안쓰셔도 됩니다.

byflashh의 이미지

말을 너무 이상하게 적었군요 댓글들 보면서 답을 얻었습니다
답변 감사합니다

oo의 이미지

증감연산자, 즉 ++ 혹은 --는 단독으로 쓰일 때는 선행(++a), 후행(a++)이든 아무 의미가 없습니다.

for문 안은 ;(semicolon)으로 분리되어 있잖아요. 이것은 독립된 문장이라는 뜻입니다. 즉 num++은 독립된 하나의 문장이으로, ++num을 쓰든지 num++을 쓰든지 상관없습니다.

위의 코드를 다시 쓰면 아래와 같이 쓸 수 있을 것 같아요.

#include <stdio.h>
 
int main(void){
	int sum = 0;
	int num;
 
	num=1;
	for(;;){
		if(!(num<=5)) break;
		sum=sum+num;
		num++;
	}
 
	printf("%d\n", sum);
	return 0;
}
pedantic의 이미지

Quote:
for문 안은 ;(semicolon)으로 분리되어 있잖아요. 이것은 독립된 문장이라는 뜻입니다. 즉 num++은 독립된 하나의 문장이으로, ++num을 쓰든지 num++을 쓰든지 상관없습니다.

음, 조금 애매하네요.

for-statement에서 괄호 안에 세 번째로 들어가는 expression은 expression-statement가 아니에요. 물론 수행되는 방식은 비슷합니다 (evaluated as a void expression). 그리고 바로 그렇기 때문에 ++num을 쓰든 num++을 쓰든 상관없다는 점도 맞습니다.

expression-statement의 끝에 들어가는 문자(;)와 for-statement에서 expression 사이에 들어가는 문자(;)가 같은 건 문법적인 soundness 및 consistency 측면에서 분명히 관련이 있다고 말할 수 있습니다. 하지만 이걸 인과관계라고 하기는 어려울 겁니다. 다른 근거가 없다면, 후자가 전자를 따라서 그렇게 정해졌다고 말할 수 있을지 모르겠네요.

oo의 이미지

pedantic의 이미지

해당 링크를 잘 읽어보셨다면, 질문자가 가리키는 세미콜론은 for-statement의 괄호 안에 있는 세미콜론이 아니라 for-statement의 loop body 자리에 들어가는 세미콜론을 가리킨다는 점을 알 수 있으실 겁니다.

그 자리는 statement가 들어갈 자리가 맞고, 거기에 세미콜론 하나만 찍어 놓으면 그건 expression-statement의 특수한 경우인 null statement입니다. 이 statement는 이름 그대로 아무 것도 안 하지요.

for-statement의 괄호 안에 있는 세미콜론(;)은 다른 이야기랍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.