아주 기초적인 질문 하나 드리겠습니다.
글쓴이: ascpm / 작성시간: 일, 2009/10/18 - 8:11오후
include
int main(void)
{
int a = 0;
int b = 2;
int result;
result = a && ++b
printf("a = %d, b= %d, result= %d\n", a, b, result);
return 0;
}
위와같이 프로그램을 짜면...
a = 0, b = 2, result = 0
이라는 값이 출력되는데요.
연산자 우선순위상 ++b가 먼저 실행되어야 하는거 아닌가요?
(a && (++b))
이렇게 해도 결과는 같게 나오는군요.
'&&' 연산은 앞이 거짓으면 뒤의 연산을 하지 않는다 <- 이것은 알고있습니다.
답변 부탁디립니다.
Forums:
잘 알고 계시네요.
"'&&' 연산은 앞이 거짓으면 뒤의 연산을 하지 않는다."는 연산자 우선순위와 관계 없습니다.
이는 평가순서와 관계 있는 것이고, ()는 우선순위를 높여주는 작업이기에 아무런 영향을 미치지 못한 것입니다.
cfaqs '3.1 Evaluation Order'에 잘 나와 있습니다.
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
결과가 맞는 것
결과가 맞는 것 같은데,
뭐가 잘못됐나요?
result 값을 묻는게 아니라...
연산자 우선순위상...
b의 값에 변화가 있어야 하지 않냐는 겁니다...
그리고 ++연산자가 &&연산자보다 우선순위가 높습니다.
네~ 저도 이상해서 실습해 봤는데,
위의 경우, AND 논리연산의 처음값이 거짓(논리가 이미 판단됨)이기 때문에 ++b 연산이 실행되지 않는군요.
위의 경우는 OR 논리연산이 모든 대상의 논리를 판단해야하기 때문에 ++b 연산이 실행되구요.
컴파일러가 논리연산을 효율적으로 판단하려 하기 때문에,
이런 결과가 나오는듯합니다. 주의 해야 겠네요~
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
틀린 부분이 있네요.
회로시절부터 있던 short-circuit 기법이 c까지 오면서 존재하는 기법이라 알고 있습니다.
라는 부분은 잘못된 부분입니다.
&& 연산자의 왼쪽이 거짓일 때나 ||의 왼쪽이 참이면 연산의 결과가 이미 정해졌기 때문에
오른쪽의 연산을 하지 않는 것입니다.
KLDP를 검색해 보시면, 이 토픽에 대한 많은 답글들과 저 기법이 적용된 유용한 팁도 접할 수 있습니다.
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
아~
맞는 지적입니다.
제가 OR 논리에 대해서 말을 잘못했습니다. freestyle님의 지적이 맞습니다~ 감사합니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
기초적인 답변
기초적인 답변 드립니다. =.=
프로그램은 명확하게 짜세요...
(그럼 좀 더 행복해집니다;;)
+1점 드리고
+1점 드리고 싶군요
한줄(혹은 한명령라인)에 하나의 명령어를 써야한다고 생각합니다.
대략 위와 같은 식으로..
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
우선순위는 실행순서와 연관이 없습니다
연산자 우선순위라는 건, 예를 들면 a-b-c*d를 봤을 때 괄호를 어떻게 넣을 것인지를 결정합니다. 이 경우는 (a-b)-(c*d)가 되지요.
우선순위는 어느 연산자가 먼저 실행되는지 결정하지 않습니다.
위의 예제에서 a-b와 c*d 중 어느 쪽을 먼저 실행하는지는 컴파일러 마음이고 이에 의존하는 프로그램은 잘못된 것입니다.
문제의 경우 &&의 동작이 "앞의 것 먼저 실행, 참이면 뒤의 것 실행"으로 되어 있기 때문에 이를 따릅니다. ++가 &&보다 우선순위가 높으냐 낮으냐는 아무런 고려의 대상이 되지 않습니다. (괄호를 넣어도 마찬가지입니다. 괄호는 우선순위를 바꾸는 용도일 뿐입니다.)
설령 고수라고
설령 고수라고 하더라도 연산자 우선순위로 인해 읽을 때 마다 잠깐의 시간을 허비해야할 정도라면 한줄한줄 따로 적는게 정답입니다.
적는데 귀찮음은 잠깐이지만, 읽을 때마다 귀찮아집니다. 다른 사람은 특히 더 말이죠.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
댓글 달기