if 조건2개 앤드 시에 2번째 조건 검사

perseuse의 이미지

만약 아래와 같은 if 문에서 2번째 조건을 검사 할까요?

---------------------------------
int a = 0;

if( (a == 1) && (b > ++c) )
{
...
}
---------------------------------

첫 번째 a 검사에서 거짓으로 판단 했을 때
두 번째 조건을 검사할까요? 한다면 ++c 는 수행 될까요?

그리고..컴파일러에 따라서 첫조건이 거짓이더라도..두번째 조건을 검사한다던데..그럴수도 있을지..
첫 조건이 거짓인데 두번빼 조건을 검사하면 ++c 가 수행이 되니까...
개발한 의도대로 안될수도 있지 않을까요?

라스코니의 이미지

short-circuit 때문에 두번째 조건 판단안할 겁니다(100% 장담 못하는 건 세상에는 정말 많은 컴파일러가 있기에....). 이런 문제를 방지하기 위해 한 문장에는 하나의 효과만 발생되도록 코딩하는 것을 추천드립니다.

if(b > ++c)

보다는
++c;
if(b > c)

가 좋은 스타일입니다.
jick의 이미지

C/C++은 (A && B)를 만났을 때 무조건 먼저 A의 값을 계산해서 참일 경우에만 B를 수행합니다. 표준으로 보장되어 있습니다. 따라서 위의 코드에서 a가 0이라면 (b > ++c)는 수행되지 않습니다.

만약 이 상황에서 ++c를 수행하는 컴파일러가 있다면 버그입니다. 아니면 표준을 지키지 않는 거지같은 시스템이거나... (그말이 그말인가...)

isanghan의 이미지

결론부터 말하지만 안합니다
C와 C문법을 참고해서 만든 C++ C# JAVA등등은 안합니다
PHP는 테스트 안해봤는데 안할겁니다..
&& 뿐만 아니라 A||B도 A가 참이면 B를 실행 안합니다

혹시 A가 참(혹은 거짓) 이라도 B를 실행시키고 싶으면
if (A & B) 혹은 if (A | B) 로 하면 됩니다

C PROGRAMMING LANGUAGE 라는 책에서 배운 내용인데 이 사실에 너무 충격 먹어서
개인적으로 좋은 프로그래밍책의 판단 기준으로 논리연산에 & | 가 한번 써진게 있냐 없냐로 보고 있습니다..
엄청난 편견이지만..

&|를 한번만 쓰는거 비트연산 말고 설명한 책은 거의 없습니다 국내도서 외국도서 통틀어도

--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--
N년째 초보입니다

익명 사용자의 이미지

왜냐하면 논리연산이 아니니까요 ~_~

C/C++언어를 기준으로...

&&, ||는 논리 연산자(Logical AND/OR operator)
&, |는 비트 연산자(Bitwise AND/OR operator).

논리 연산자는 반드시 왼쪽 피연산자를 먼저 평가하고, 꼭 필요한 경우에만 오른쪽 피연산자를 평가하는데
앞서 다른 분들이 답변 주셨듯 단축 평가(short-circuit evaluation)라고 부릅니다.

이거 설명 안 해 주는 C/C++ 교본은 거칠게 말하자면 C/C++ 교본이라고 볼 수가 없어요.

======

비트 AND/OR 연산을 단축 평가 없는 논리연산으로 쓰는 게 가능하기는 한데
비트 연산은 bool을 받아서 bool을 내놓는 연산이 아니라는 점 유의하는 것이 좋겠습니다.

간단히 예를 들어서, 2 && 1은 true이지만 2 & 1은 0이지요.

댓글 달기

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