아주 기초적인 질문 하나 드리겠습니다.

ascpm의 이미지

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))
이렇게 해도 결과는 같게 나오는군요.
'&&' 연산은 앞이 거짓으면 뒤의 연산을 하지 않는다 <- 이것은 알고있습니다.
답변 부탁디립니다.

freestyle의 이미지

"'&&' 연산은 앞이 거짓으면 뒤의 연산을 하지 않는다."는 연산자 우선순위와 관계 없습니다.

이는 평가순서와 관계 있는 것이고, ()는 우선순위를 높여주는 작업이기에 아무런 영향을 미치지 못한 것입니다.

cfaqs '3.1 Evaluation Order'에 잘 나와 있습니다.
----------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

ifree의 이미지

결과가 맞는 것 같은데,
뭐가 잘못됐나요?

ascpm의 이미지

연산자 우선순위상...
b의 값에 변화가 있어야 하지 않냐는 겁니다...
그리고 ++연산자가 &&연산자보다 우선순위가 높습니다.

rgbi3307의 이미지

a = 0;
b = 2;
result = a && ++b;

위의 경우, AND 논리연산의 처음값이 거짓(논리가 이미 판단됨)이기 때문에 ++b 연산이 실행되지 않는군요.

a = 0;
b = 2;
result = a || ++b;

위의 경우는 OR 논리연산이 모든 대상의 논리를 판단해야하기 때문에 ++b 연산이 실행되구요.

컴파일러가 논리연산을 효율적으로 판단하려 하기 때문에,
이런 결과가 나오는듯합니다. 주의 해야 겠네요~

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

freestyle의 이미지

Quote:
a = 0;
b = 2;
result = a && ++b;

위의 경우, AND 논리연산의 처음값이 거짓(논리가 이미 판단됨)이기 때문에 ++b 연산이 실행되지 않는군요.

a = 0;
b = 2;
result = a || ++b;

위의 경우는 OR 논리연산이 모든 대상의 논리를 판단해야하기 때문에 ++b 연산이 실행되구요.

컴파일러가 논리연산을 효율적으로 판단하려 하기 때문에,
이런 결과가 나오는듯합니다. 주의 해야 겠네요~

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

회로시절부터 있던 short-circuit 기법이 c까지 오면서 존재하는 기법이라 알고 있습니다.

Quote:
OR 논리연산이 모든 대상의 논리를 판단해야하기 때문에

라는 부분은 잘못된 부분입니다.

&& 연산자의 왼쪽이 거짓일 때나 ||의 왼쪽이 참이면 연산의 결과가 이미 정해졌기 때문에
오른쪽의 연산을 하지 않는 것입니다.

KLDP를 검색해 보시면, 이 토픽에 대한 많은 답글들과 저 기법이 적용된 유용한 팁도 접할 수 있습니다.

----------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

rgbi3307의 이미지

맞는 지적입니다.
제가 OR 논리에 대해서 말을 잘못했습니다. freestyle님의 지적이 맞습니다~ 감사합니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

haze11의 이미지

기초적인 답변 드립니다. =.=
프로그램은 명확하게 짜세요...
(그럼 좀 더 행복해집니다;;)

Fe.head의 이미지

+1점 드리고 싶군요

한줄(혹은 한명령라인)에 하나의 명령어를 써야한다고 생각합니다.

int a = 0;
int b = 2;
 
++b; int result = a && b;

대략 위와 같은 식으로..
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

jick의 이미지

연산자 우선순위라는 건, 예를 들면 a-b-c*d를 봤을 때 괄호를 어떻게 넣을 것인지를 결정합니다. 이 경우는 (a-b)-(c*d)가 되지요.

우선순위는 어느 연산자가 먼저 실행되는지 결정하지 않습니다.

위의 예제에서 a-b와 c*d 중 어느 쪽을 먼저 실행하는지는 컴파일러 마음이고 이에 의존하는 프로그램은 잘못된 것입니다.

문제의 경우 &&의 동작이 "앞의 것 먼저 실행, 참이면 뒤의 것 실행"으로 되어 있기 때문에 이를 따릅니다. ++가 &&보다 우선순위가 높으냐 낮으냐는 아무런 고려의 대상이 되지 않습니다. (괄호를 넣어도 마찬가지입니다. 괄호는 우선순위를 바꾸는 용도일 뿐입니다.)

semmal의 이미지

설령 고수라고 하더라도 연산자 우선순위로 인해 읽을 때 마다 잠깐의 시간을 허비해야할 정도라면 한줄한줄 따로 적는게 정답입니다.

적는데 귀찮음은 잠깐이지만, 읽을 때마다 귀찮아집니다. 다른 사람은 특히 더 말이죠.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.