&& 및 || 논리적 인 것이 아니라 조건부 연산자입니까?


62

그 내용의 MSDN C #을 문서로 혼란 비트입니다 &및 |논리 연산자이며, 그 &&와는 ||조건 연산자입니다.

나는 계속 전화 &&, ||및 !논리 연산자, 그래서 내가 잘못입니까?


4
비논리적 인 것처럼 보이지만 두 클래스 사이에는 중요한 차이점 |이 있으며 ||, 많은 경우 프로그램 동작에 명백한 변화없이 상호 교환 할 수 있지만, 상호 교환 가능 하다고 가정하지 않는 것이 중요합니다 .
— 다니엘 R cks

답변:


120

그 내용의 MSDN C #을 문서로 혼란 비트입니다 &및 |논리 연산자이며, 그 &&와는 ||조건 연산자입니다. 나는 계속 전화 &&, ||및 !논리 연산자, 그래서 내가 잘못입니까?

아니; 당신은 맞습니다.

MSDN 설명서에는 작고 중요하지 않은 명명법 오류가 많이 있습니다. 나는 가능한 한 많은 것들을 꺼내려고 노력했지만, 그것이 잘못되고 오도되지 않는 경우에는 항상 시간을 현명하게 사용하는 것은 아닙니다. C # 기능의 이름에 대한 명확한 설명을 원하면 사양으로 이동하십시오.

따라서 관련 권한은 C # 사양이며 섹션 7.11에 나와 있습니다.

는 &, ^및 |연산자는 논리 연산자라고합니다.

그런 다음 내장 논리 연산자를 정수, 열거, 부울 및 널 입력 가능 부울 논리 연산자로 세분화합니다. 사용자 정의 논리 연산자도 있습니다. 자세한 내용은 사양을 참조하십시오.

섹션 7.12에서

&&및 ||연산자는 조건부 논리 연산자라고합니다. 또한 "단락"논리 연산자라고도합니다.

따라서 모두 논리 연산자입니다. 그들 중 일부는 조건부 논리 연산자 입니다.

조건부 논리 연산자를 조건부로 만드는 것은 무엇입니까 ? 하나는 일반적으로 사용되는 때문입니다있는 그럴듯한 추측을 할 수 조건문 ( if) 또는 조건식 ( ? :). 실제 이유는 사양에 의해 제공됩니다.

&&및 ||연산자는 조건의 버전입니다 &및 |운영자 : 작업이 x && y작업에 해당하는 x & y것을 제외하고, y경우에만 평가 x거짓이 아니다. 작업 이 true가 아닌 경우에만 평가되는 것을 제외하고 작업에 x || y해당 합니다.x | yyx

따라서 오른쪽 피연산자가 왼쪽 피연산자의 값에 따라 조건부로 평가 되므로 조건부 논리 연산자의 이름이 지정 됩니다.

조건부 논리 연산자 는 조건부 표현식에 대한 "구문 설탕" 이라는 점을 주목하면보다 생생하게 볼 수 있습니다 . x && y간단하게 작성하는 쾌적한 방법 x ? y : false, 그리고 x || y간단하게 작성하는 쾌적한 방법입니다 x ? true : y. 조건부 논리 표현식은 실제로 조건부 표현식입니다.

조건부 논리 연산자에는 사용자 정의 형식도 있으며 약간 까다 롭습니다. 자세한 내용은 사양을 참조하십시오.

이 주제에 관심이 있다면 더 읽어보십시오.


3
@RobertHarvey : &는 bools, integer type 또는 enum type에서 작동 할 수 있지만 && bool에서만 작동한다는 사실은 그 중 하나를 연산자의 "조건부"형식으로 명명하는 것과는 관련이 없습니다. 조건부 연산자는 평가 의미론에 조건부 분기가 있으므로 조건부 연산자입니다.
— Eric Lippert

16
나는 "단락 연산자"라는 용어가 설명 된 의미에서 "조건 연산자"보다 훨씬 더 대중적이며 아마도 덜 모호하다는 인상을 받고 있습니다.
— Doc Brown

15
@DocBrown : 그것은 확실히 인기가 있지만, 나는 항상 그 이름이 오도하는 것을 발견했습니다. 결과를 얻는 데있어 "단락"과 "단축"이 같은 것이라고 생각한 누군가에 의해 만들어진 것 같습니다. 단락은 전기 시스템을 빠르게 파괴 할 수있는 위험한 결함입니다. 잘못 사용하면 위험 하기 때문에 C #에서 "안전하지 않은"블록의 이름을 "안전하지 않은" 것으로 지정했습니다 . 귀엽고 가치있는 이름을 가진 것들을 줍시다. Elvis 운영자를 시작하지 마십시오. :-)
— Eric Lippert

26
@EricLippert : "단락"은 일반 대중에게 무섭게 들릴지 모르지만 K & R이 실제 정의에 대해 혼동하지 않았다고 생각합니다. 전기 공학에서 회로 단락은 항상 위험한 결함은 아닙니다. 실제로 우리는 고의적으로 항상 그렇게합니다. 그것은 전기에 따라야 할 짧은 경로를 제공함으로써 회로의 불필요한 부분을 차단하는 것을 의미합니다.
— hackerb9

1
@CortAmmon : 사용자 정의 연산자 의미가 약간 다르며 세부 사항은 사양을 참조해야한다고 말하는 다음 단락을 읽으려고합니다.
— Eric Lippert

27

C #에서 이들은 모두 논리 연산자입니다.

int x = 0xABCD & 0xFF // x == 0xCD

&&그리고 ||"이라고 조건 들이 있기 때문에 논리 연산자" 단락.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

이 용어는 언어마다 다릅니다. C 및 C ++에서 &&와 ||단지이다 논리 연산자. 자바에서 &와 |라고 비트 연산자 C 및 C ++가로 분류하면서, 산술 연산자 .


3
그렇습니다. Microsoft는 권한이지만 권위있는 문서는 사양입니다. 섹션 7.12, 조건부 논리 연산자를 참조하십시오 .
— Eric Lippert

8
이야기의 도덕은 다음과 같습니다 . 이름에 대해 정확한 것보다이 연산자의 역할을 정확하게 이해하는 것이 더 중요합니다.
— Robert Harvey

21
운영자가하는 일에 집중하고 어휘에 집착하지 마십시오. 명명 된 유해한 이름 지정을 참조하십시오 .
— Robert Harvey

4
+1. 질문에 나열된 모든 것은 하나 또는 두 개의 표현식을 취하고 값으로 평가되는 연산자 입니다. 형용사는 불필요한 머리카락 분리입니다.
— Blrfl


-2

점은이다 &하고 |있습니다 비트 단위 가와 수율 비트 문자열 값 적용되는 의미 연산자. 그리고 비트 단위는 프로그래머들에게 매우 사용되는 용어입니다.

예를 들어 0xff & 0x00 == 0x00, while 0xff | 0x00 == 0xff.

그리고 &&및이 ||조건에 적용 및 조건의 일반적인 값을 얻을 수있다; 즉, true와 false.

예를 들어 true && false == false, while true || false == true.

따라서 &&및 ||호출 할 수있는 조건 즉 프로그래머들 사이에서 일반적인 용어가 아니더라도, 연산자.

물론 모든 C, C ++, Java 및 C # 프로그래머는이 모든 것을 알고 있습니다. 그러나 "조건부 연산자"가 우리 프로그래머가 자주 사용하는 용어가 아니기 때문에 오해가 발생한 것 같습니다.


5
물론 모든 C, C ++, Java 및 C # 프로그래머는이 모든 것을 알고 있습니다. OP가 바보라는 것을 암시하는 것은 매우 무례한 일입니다. 프로그래머 를 작성 하여 OP를 제외하면됩니다. 그렇게하지 마십시오.
— DarkDust

1
Eric Lippert의 답을 얻은 후에 나중의 대답이 부가 가치를 가져다 준다고 생각하지 않으며 더 나아가 질문의 요점을 이해하지 못한다는 의미에서 잘못되었습니다.
— 혼자 지덱

@DarkDust 모든 C, C ++, Java 및 C # 프로그래머는 이러한 연산자를 이해해야합니다. 이것은 무례한 것이 아니라 사실 입니다.
— Phil1970

1
@ Phil1970 : OP는 이러한 연산자를 이해하는 것 같습니다 . 이름을 명확하게하는 것입니다 . 이러한 관점에서 힐튼의 답변에서 관련 용어를 강조하면서 그의 문장은 모든 프로그래머가 이러한 이름 지정 세부 사항에 대해 알고 있음을 의미하는 것으로 해석 될 수 있지만 그렇지 않습니다 . 이것은 (다른 답변의 토론에서 볼 수 있듯이 ) 잘못되었으며 그 문구는 무례합니다.
— DarkDust

4
친애하는, 내 대답이 무례하게 보이면 미안합니다. 영어는 모국어가 아닙니다. 어쨌든 나는 OP가 프로그래머가 아니라는 것을 암시하려고하지 않았습니다. Au contraire, 나는 그 또는 그녀가 읽은 텍스트에서 이상한 이름으로 혼동되었다는 것을 의미했습니다. 내가하려고했던 모든 것은 프로그램 조각으로 비정상적인 명명을 명확하게하는 것입니다.
— 힐튼 페르난데스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.