논리 연산자의 서면 버전


94

이것은 내가 본 유일한 장소 and, or그리고 notC ++의 실제 운영자로 나열. NetBeans에서 테스트 프로그램을 작성할 때 구문 오류가있는 것처럼 빨간색 밑줄이 표시되고 웹 사이트가 잘못되었다고 생각했지만 예상대로 컴파일 및 실행 되었기 때문에 잘못된 것은 NetBeans입니다.

나는 !선호되는 것을 볼 수 not있지만 and&& 의 가독성은 or문법적 형제보다 더 큰 것 같습니다. 이러한 버전의 논리 연산자가 존재하는 이유와 아무도 사용하지 않는 이유는 무엇입니까? 이것이 진정으로 유효한 C ++입니까, 아니면 언어에 포함 된 C와의 일종의 호환성입니까?


4
\ me 그의 모든 코드를 다시 작성합니다
Limited Atonement

2
"클린 코드"의 정신에 나는 개인적으로 떨어져 쓰는 습관과 함께 할 것을 권 해드립니다 ||그리고 &&어쩌면, !시간에. 비트 조작 연산자와의 혼동 가능성은 말할 것도없고 단어는 항상 "라인 노이즈"보다 낫습니다.
Ichthyo는

2
@Ichthyo 항상 정확하지는 않습니다. 많은 단어를 읽는 것보다 많은 기호를 읽고 그 의미를 아는 것이 훨씬 빠릅니다.
vallentin

인간 독자에게 더 명확한 것은 "Gestalt"에 달려 있습니다. 때로는 기호가 혼란스러운 용어보다 명확 할 수 있지만이 경우에는 그렇지 않습니다. 그리고, 영어의 단순한 단어는 다소 이상한 프로그래밍 언어의 이상한 특수 기호보다 훨씬 더 보편적입니다 ...
Ichthyo

3
그 말의 아이러니 and"작성 후 더 읽을 수 및 and&& or하지만 :)"
이반 Vergiliev

답변:


111

그것들은 헤더의 C에서 시작되었습니다 <iso646.h>. 그 당시에는 &&(예를 들어)에 필요한 기호를 입력 할 수없는 키보드가 있었기 때문에 헤더에는 #define(우리의 예에서)로 정의 and하여 그렇게하는 데 도움이되는 의가 포함되어 &&있었습니다. 물론 시간이 지남에 따라 덜 사용되었습니다.

C ++에서는 대체 토큰 으로 알려진 것이되었습니다 . 호환 컴파일러에서 이러한 토큰을 사용하기 위해 아무것도 포함 할 필요 가 없습니다 (예 : C 헤더의 C ++ 버전 <ciso646>이 비어 있음). 대체 토큰은 철자를 제외하고 일반 토큰과 같습니다. 그래서 구문 분석 중 and입니다 정확히 같은 &&이 같은 일을 철자의 단지 다른 방법입니다.

사용에 관해서는 거의 사용되지 않기 때문에 사용하는 것이 도움이되는 것보다 더 놀랍고 혼란스러운 경우가 많습니다. 나는 그것이 정상이라면 읽기가 훨씬 쉬울 것이라고 확신하지만 사람들은 너무 익숙 &&하고 ||다른 것은 산만 해집니다.

편집 : 그러나 이것을 게시 한 이후로 사용량이 약간 증가했습니다. 나는 여전히 그들을 피합니다.


그렇다면 이러한 대체 토큰의 해석은 컴파일러 기능 일 뿐입니 까 아니면 C ++ 사양에 있습니까?
defectivehalt

2
@Kavon : 표준의 섹션 2.5에 지정되어 있습니다. 언어 기능입니다.
GManNickG 2010 년

15
나는 개인적으로 그들이 훨씬 더 낫다고 생각한다. 그러나 나는 파이썬 편견이다. 나는 그것이 깨진 있지 않은 경우는 ... 코드 아니라고 왜 어떤 사람들에게 일이 모르는
마티유 M.

그래서 이것들은 헤더 파일을 포함하지 않고 C에서 유효하지 않습니까? 나는 이것이 모든 사람이 사용하지 않는다는 것에 놀랐습니다. 그들은 파이썬을 훨씬 더 읽기 쉽게 만듭니다.
endolith 2013 년

1
적어도 비주얼 스튜디오 2015 CTP (6) 내 좋아하지 않았다 or또는 not헤더를 포함하지 않고.
usr1234567

18

유용성 (키보드 / 디스플레이 버전의 문자 지원)과 일반적인 가독성을 위해 존재하지만 요즘 더 두드러지는 또 다른 이유가 있습니다. 거의 답변 없음 여기 , 여기 , 또는 주요 대답 여기우리 중 많은 사람들이 기호 버전보다 단어 버전을 선호하는 핵심 이유 (및 다른 언어에서 사용하는 주요 이유) : 버그를 설명합니다. 단어 버전 간의 차이점은 매우 눈에.니다. 심볼 버전 간의 차이는 훨씬 적기 때문에 버그를 비교적 훨씬 더 많이 유혹 할 수 있습니다. "x | y"는 "x || y"가 아니라 더 큰 표현에 포함될 때 많은 사람들이 차이를 놓치십시오. 이는 할당 대 같음 연산자의 일반적인 우발적 혼합과 유사합니다. 이런 이유로 나는 단어 버전을 선호하기 위해 기호 버전을 포기했습니다 (쉽지 않았습니다). 나는 누군가가 벌레를 유혹하는 것보다 오래된 것에 대한 우리의 사랑 때문에 그들에게 이중을가하도록하고 싶습니다.


4
불행히도 Visual Studio (VS2013 기준 /Za)에서 대체 키워드를 지원하려면 특정 컴파일러 옵션 ( )을 설정해야합니다 ( stackoverflow.com/a/555524/368896 참조 ). 그것은 아마도 다른 영향을 미칠 것입니다. 따라서 Visual Studio에서이 조언을 취하는 것이 반드시 안전하지는 않습니다.
Dan Nissenbaum 2014-06-11

FWIW는 / - 내가 운영자에 공백을 넣어, x | y충분히에서 (고정 폭 글꼴) 시각적으로 구분된다 x || y,하지만 난을 발견 할 !예에 if (!f(xyz) && ...비해 미스에 쉽게 if (not f(xyz) && ....
Tony Delroy

@Tony D 연산자 주위에 공백을두면 그것은 독자에게 분명하지 않은 개인적인 규칙입니다. 그러나 and, ornot부울 표현식 과 같은 자연어 단어를 사용 하면 실제로 가독성이 향상되고 비트 조작에 대한 구별이 강조됩니다. 따라서 IMHO 우리는 사랑하는 옛 습관을 더 나은 것으로 바꾸는 것을 고려해야합니다 ...
Ichthyo

@DanNissenbaum C / C ++> Language> Disable Language Extensions 라는 이름에서이 옵션을 찾았 으므로 부작용을 예상하는 것이 비교적 안전합니다.)
Wolf

6
사람들이 어떻게 작동해야하는지에 대한 사람들의 생각 andor편견 때문에 파이썬 버그가 얼마나 많이 도입되었는지 알고 있습니까? 예를 들어 if (a == b or c)대신 if (a == b || a == c)-이와 같은 것이 거의 매일 여기 StackOverflow에서 나타납니다. 영어에서 분리 된 추상 기호는 이러한 오류를 줄입니다.
마크 랜섬

10

6
기술적으로는 키워드가 아니라 대체 토큰입니다. :)
GManNickG 2010 년

2
@GMan : +1 멋지지만 Dinkumware 페이지에서는 키워드라고 부르기 때문에 구분에 대해별로 신경 쓰지 않았다고 생각합니다.
Chris Jester-Young


그렇다면 MSVC는 C ++에서는 지원하지 않지만 C에서는 지원하지 않습니까?
rwst

1
@rwst MSVC에 대해 구체적으로 언급 할 수는 없지만 C ++ 및 C 표준을 충실하게 구현하면 실제로 그럴 것입니다. 참조 : stackoverflow.com/questions/2376448/...을
크리스 광대 영에게

2

and&&++ 기능적으로 C에서 동일합니다. andor운영자는 진정으로 유효한 C ++ 및 언어 표준의 일부입니다.

구체적인 예를 들어 다른 답변에 대해 자세히 설명하려면 "가독성"외에 다른 이유 and&&있습니다. 논리적 AND가 의미하는 바인 경우 "and"를 명시 적으로 철자하면 미묘한 버그의 가능성이 제거됩니다.

이걸 고려하세요:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

세 가지 if 문은 모두 컴파일되지만 마지막 문은 완전히 다르고 의도하지 않은 것을 의미합니다!

and논리 AND를 의미 할 때 항상 사용하는 경우 실수로 "&"를 입력하지 않고 코드를 성공적으로 컴파일하고 신비한 결과로 실행할 수 있습니다.

또 다른 좋은 연습 : 실수로 "and"문자를 생략하고 어떤 일이 발생하는지 확인하십시오. ;)


1
이것은 실제로 질문에 대한 답이 아닙니다. 당신이 느끼는 것이 더 읽기 쉽다고 말하는 것입니다. OP는 작성된 버전이 더 나은 것이 아니라 어떻게 작동하는지 물었습니다. 그리고 다른 사람이 이미 당신이 말하려는 것과 같은 점을 지적했습니다.
Nicol Bolas 19.01.14

실제로 더 유용한 정보를 제공하지는 않지만 대답에 " and&&기능적으로 동일"을 추가합니다. 제 대답을 읽으면 가독성에 관한 것이 아니라는 것을 알 수 있습니다.)
tjwrona1992
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.