왜 '&'가 아닌 '&&'입니까?


135

&&바람직 &하고 ||바람직 |합니까?

나는 수년간 프로그래밍을 해 온 누군가에게 물었고 그의 설명은 다음과 같습니다.

예를 들어,에 if (bool1 && bool2 && bool3) { /*DoSomething*/ }, bool1시험에 대한 진실이어야 bool2로 이동하기 전에 사실로 가지고 bool3내가 하나를 사용했던 경우 등, &대신 그들 모두에 충실 할 경우에도 시험에는 순서가 없다 다음 줄로 나아가면 어쨌든 중요한가요?

참고 : 나는 유아와 동등한 프로그래밍이고 이것은 심각하거나 긴급한 질문이 아니라는 것을 지적하고 싶습니다. 왜 일이 다른 사람과 반대로 특정 방식으로 이루어져야 하는지를 이해하는 것이 더 중요합니다.


55
& 및 && | 그리고 || 완전히 다른 사업자는
펠리스 Pollano

3
이것은 단지 C #을 적용하지 않는 한, 다시 태그
조나단 디킨슨

12
답변은 이미 C #에만 해당되며 내부 작업은 일반적으로 동일한 개념을 가진 다른 언어에서는 약간 다를 수 있기 때문에 되돌 렸습니다.
Daniel Hilgarth

8
@Felice : 그것들은 다르지만 거의 완전히 다릅니다. 그들은 실제로 매우 유사합니다 x & yx && yx와 y는 부울 유형의 표현하면 항상 같은 결과를 평가합니다. 실제로이 경우의 유일한 차이점은에서 x & yy는 항상 평가 된다는 것 같습니다 .
Joren

1
@ slawekin : 나는 대답을 읽는 것이 좋습니다. 일부는 성능 차이에 대해 광범위하게 씁니다. 대답은 당신을 놀라게 할 수 있습니다.
Abel

답변:


183

대부분의 경우, &&||이상 선호 &하고 |이전하기 때문에 평가는 즉시 결과를 알 수있는 바와 같이 취소 즉, 단락이다.

예:

if(CanExecute() && CanSave())
{
}

CanExecute반환 하면 의 반환 값에 관계없이 false전체 표현식이됩니다 . 이 때문에 실행되지 않습니다.falseCanSaveCanSave

이것은 다음과 같은 상황에서 매우 편리합니다.

string value;
if(dict.TryGetValue(key, out value) && value.Contains("test"))
{
    // Do Something
}

TryGetValuefalse제공된 키가 사전에 없으면를 반환 합니다. 때문에의 단락 특성 &&, value.Contains("test")경우에만 실행됩니다 TryGetValue반환 true따라서와는 value아닙니다 null. 비트 AND 연산자를 &대신 사용 NullReferenceException하면 식의 두 번째 부분이 실행되므로 사전에 키를 찾을 수 없으면 if가 표시됩니다.

이와 비슷하지만 더 간단한 예는 다음 코드입니다 (TJHeuvel에서 언급 한대로).

if(op != null && op.CanExecute())
{
    // Do Something
}

CanExecuteop아닌 경우에만 실행됩니다 null. 경우 op이며 null, 식의 첫 번째 부분은 ( op != null)로 평가 false하고, 나머지의 평가 ( op.CanExecute()) 스킵된다.

이 외에도에서은, 기술적으로, 그들도, 다른 :
&&||에서만 사용할 수있는 bool반면, &|모든 정수 계열 형식 (사용할 수 있습니다 bool, int, long, sbyte그들이 비트 연산자이기 때문에, ...). &는 IS 비트 AND 연산자와 |는 IS 비트 OR 연산자.

매우 정확하게 말하자면 C #에서 이러한 연산자 ( &, |[및 ^])를 "논리 연산자"라고합니다 ( C # 사양 , 장 7.11 참조). 이러한 연산자에는 여러 가지 구현이 있습니다.

  1. 정수의 ( int, uint, longulong, 제 7.11.1)
    들은 피연산자 오퍼레이터의 비트 결과를 계산하도록 구현되고, 즉, &비트 단위 논리 계산하도록 구현이다 AND등등
  2. 열거 형의 경우 (7.11.2 장) :
    기본 형식의 열거 형의 논리적 작업을 수행하도록 구현됩니다.
  3. 부울 및 널 입력 가능 부울 (7.11.3 및 7.11.4 장)의 경우 :
    비트 단위 계산을 사용하여 결과가 계산되지 않습니다. 결과는 가능성이 너무 적기 때문에 기본적으로 두 피연산자의 값을 기반으로 조회됩니다.
    두 값 모두 조회에 사용되므로이 구현은 단락되지 않습니다.

31
또한 무언가가 null인지 확인하는 데 유용 할 수 있습니다. 예를 들면 다음과 같습니다 if(op != null && op.CanExecute()).. 첫 번째가 참이 아닌 경우 두 번째 원인은 평가되지 않으므로 유효합니다.
TJHeuvel

2
@ TJHeuvel : 이것은 기본적으로 필자의 TryGetValue예제에서 설명한 것과 같은 사용법 입니다. 그러나 그렇습니다. 이것의 또 다른 좋은 예입니다.
Daniel Hilgarth

4
좋은 대답입니다. 어쩌면 모든 사람의 이익을 위해 non-bool 인수와 함께 &또는 |연산자를 사용 하는 방법에 대한 예를 추가해야 할 수도 있습니다 .
Zabba

81

이것이 의미하는 바를 명확하게 설명하기 위해 (다른 답변이 암시하더라도-아마도 이해하지 못하는 용어를 사용하십시오).

다음 코드 :

if (a && b)
{
   Foo();
}

실제로 이것으로 컴파일됩니다 :

if (a)
{
    if (b)
    {
        Foo();
    }
}

다음 코드는 표시된 그대로 정확하게 컴파일됩니다.

if (a & b)
{
   Foo();
}

이것을 단락이라고합니다. 일반적으로 항상 &&그리고 ||귀하의 조건에서 사용해야 합니다.

보너스 마크 : 하지 말아야 할 한 가지 시나리오가 있습니다. 만약 성능이 결정적인 상황에 있다면 (이것은 나노초 결정적입니다 ) 단락 null은 분기 / 점프이므로 반드시 (예 : 점검) 단락을 사용하십시오 . CPU에서 분기 오류가 발생할 수 있습니다. 는 &보다 훨씬 저렴합니다 &&. 단락이 실제로 논리를 깰 수있는 시나리오도 있습니다 . 이 답변 을 살펴보십시오 .

Diatribe / Monologue : 가장 행복하게 무시하는 가지 잘못 예측에 대해 Andy Firth 인용 (13 년 동안 게임을해온 사람) : "이것은 사람들이 갈 필요가 있다고 생각하는 수준이 낮을 수 있지만 잘못되었을 것입니다. 프로그래밍하는 하드웨어가 지점을 어떻게 처리 할 수 ​​있는지 이해 대부분의 프로그래머가 re : death of a 1,000 cuts보다 훨씬 더 감사 할 것입니다. "

  • 게임 개발자 (및 극단적 인 실시간 조건에서 작업하는 다른 사람들)는 예측 변수에 더 적합하도록 논리를 재구성하는 것까지 진행합니다. 디 컴파일 된 mscorlib 코드에도 이러한 증거가 있습니다.
  • .NET이 이러한 유형의 것을 차단한다고해서 중요하지 않다는 의미는 아닙니다. 브랜치 잘못 예측은 60Hz에서 엄청나게 비싸다. 또는 10,000 요청 / 초
  • 인텔은 잘못된 예측 위치를 식별 할 수있는 도구가 없거나 Windows에 이에 대한 성능 카운터가 없거나 문제를 설명 할 단어가 없습니다.
  • 낮은 수준과 아키텍처에 대한 무지가 자신을 잘 아는 사람을 만들지는 않습니다.
  • 작업중인 하드웨어의 한계를 항상 이해하십시오.

다음은 비신자에 대한 벤치 마크입니다. https://gist.github.com/1200737에 영향을 미치는 스케줄러를 완화하기 위해 RealTime / High에서 프로세스를 실행하는 것이 가장 좋습니다.


7
"보너스 마크"정보 : 우리 모두는 조기 최적화에서 비롯된 장점을 알고 있습니다. :)
CVn

6
@Michael-그렇기 때문에 'nano-seconds critical'가 굵게 표시됩니다. AAA 게임 개발자는 일반적으로 다음과 같은 것에 대해 걱정합니다. 그리고 누가 답을 읽을 것인지 알 수 없습니다. 따라서 항상 경계선 / 극단적 사례까지 문서화하는 것이 가장 좋습니다.
Jonathan Dickinson

1
해당 보너스 마크는 C #에 유효합니까? MSIL이 해석되었으므로 표현식이 기계 코드로 바로 컴파일되지 않는 한 나는 생각하지 않았습니다.
Jeremy McGee

7
@Jeremy MSIL은 해석되지 않습니다.
Jonathan Dickinson

2
@ TheD recheck answer-나는 당신이 이것에 대해 걱정 해야하는 이유에 대한 독백을 추가했습니다. 그리고 FYI는로 (x && y)번역되는 LOAD x; BRANCH_FALSE; LOAD y; BRANCH_FALSE;곳으로 (x & y)번역합니다 LOAD x; LOAD y; AND; BRANCH_FALSE;. 하나의 분기 대 두.
Jonathan Dickinson

68

논리 연산자 ( ||&&)와 비트 연산자 ( |&).

논리 연산자와 비트 연산자의 가장 중요한 차이점은 논리 연산자는 두 개의 부울을 취하고 부울을 생성하는 반면 비트 연산자는 두 개의 정수를 취하고 정수를 생성한다는 것입니다 (참고 : 정수는 int뿐만 아니라 모든 정수 데이터 유형을 의미 함).

반복적으로 비트 단위 연산자는 비트 패턴 (예 : 01101011)을 가져와 각 비트에서 비트 단위 AND / OR을 수행합니다. 예를 들어 두 개의 8 비트 정수가있는 경우 :

a     = 00110010 (in decimal:    32+16+2   = 50)
b     = 01010011 (in decimal: 64+   16+2+1 = 83)
----------------
a & b = 00010010 (in decimal:       16+2   = 18)
a | b = 01110011 (in decimal: 64+32+16+2+1 = 115)

논리 연산자는 다음에서만 작동합니다 bool.

a      = true
b      = false
--------------
a && b = false
a || b = true

둘째, true와 false가 각각 1과 0과 같기 때문에 bool에서 비트 연산자를 사용하는 것이 종종 가능하며, true를 1로 변환하고 0을 0으로 변환하면 비트 연산을 수행 한 다음 0이 아닌 값을 변환합니다 true로, 0에서 false로; 논리 연산자를 방금 사용한 경우 결과가 동일하게됩니다 (연습을 위해 이것을 점검하십시오).

또 다른 중요한 차이점은 논리 연산자가 단락 되었다는 것 입니다. 따라서 일부 서클에서 [1] 사람들은 종종 다음과 같은 일을하는 것을 보게됩니다.

if (person && person.punch()) {
    person.doVictoryDance()
}

어떤로 변환 : "사람이 (즉, null이 아닌)이있는 경우, 그에게 / 그녀에게 펀치를 시도하고 펀치가 (사실 즉, 반환) 성공하면, 다음 승리의 춤을" .

비트 연산자를 대신 사용했다면 다음과 같습니다.

if (person & person.punch()) {
    person.doVictoryDance()
}

에 변환합니다 : "사람이 존재하는 경우 (즉, null이 아닌)과 펀치 (사실, 즉 반환), 다음 승리의 춤을 성공한다" .

단락 된 논리 연산자에서 널 (null) 인 person.punch()경우 코드가 전혀 실행되지 않을 수 있습니다 person. 실제로,이 특정한 경우, 두 번째 코드는 사람이 null인지 여부에 관계없이 person호출하려고하기 때문에 널 (null) 인 경우 널 참조 오류를 생성합니다 person.punch(). 올바른 피연산자를 평가하지 않는 이러한 동작을 단락 이라고 합니다.

[1] 일부 프로그래머는 부작용이있는 함수 호출을 if표현식 안에 넣는 것에 대해 혼란 스러울 수 있지만, 다른 프로그래머에게는 일반적이고 유용한 관용구입니다.

비트 연산자는 한 번에 32 비트에서 작동하기 때문에 (32 비트 시스템을 사용하는 경우), 예를 들어, 여러 조건을 비교해야하는 경우보다 우아하고 빠른 코드로 이어질 수 있습니다.

int CAN_PUNCH = 1 << 0, CAN_KICK = 1 << 1, CAN_DRINK = 1 << 2, CAN_SIT = 1 << 3,
    CAN_SHOOT_GUNS = 1 << 4, CAN_TALK = 1 << 5, CAN_SHOOT_CANNONS = 1 << 6;

Person person;
person.abilities = CAN_PUNCH | CAN_KICK | CAN_DRINK | CAN_SIT | CAN_SHOOT_GUNS;

Place bar;
bar.rules = CAN_DRINK | CAN_SIT | CAN_TALK;

Place military;
military.rules = CAN_SHOOT_CANNONS | CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT;

CurrentLocation cloc1, cloc2;
cloc1.usable_abilities = person_abilities & bar_rules;
cloc2.usable_abilities = person_abilities & military_rules;

// cloc1.usable_abilities will contain the bit pattern that matches `CAN_DRINK | CAN_SIT`
// while cloc2.usable_abilities will contain the bit pattern that matches `CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT`

논리 연산자를 사용하여 동일한 작업을 수행하려면 어색한 비교가 필요합니다.

Person person;
person.can_punch = person.can_kick = person.can_drink = person.can_sit = person.can_shoot_guns = true;
person.can_shoot_cannons = false;

Place bar;
bar.rules.can_drink = bar.rules.can_sit = bar.rules.can_talk = true;
bar.rules.can_punch = bar.rules.can_kick = bar.rules.can_shoot_guns = bar.rules.can_shoot_cannons = false;

Place military;
military.rules.can_punch = military.rules.can_kick = military.rules.can_shoot_guns = military.rules.can_shoot_cannons = military.rules.can_sit = true;
military.rules.can_drink = military.rules.can_talk = false;

CurrentLocation cloc1;
bool cloc1.usable_abilities.can_punch         = bar.rules.can_punch         && person.can_punch,
     cloc1.usable_abilities.can_kick          = bar.rules.can_kick          && person.can_kick,
     cloc1.usable_abilities.can_drink         = bar.rules.can_drink         && person.can_drink,
     cloc1.usable_abilities.can_sit           = bar.rules.can_sit           && person.can_sit,
     cloc1.usable_abilities.can_shoot_guns    = bar.rules.can_shoot_guns    && person.can_shoot_guns,
     cloc1.usable_abilities.can_shoot_cannons = bar.rules.can_shoot_cannons && person.can_shoot_cannons
     cloc1.usable_abilities.can_talk          = bar.rules.can_talk          && person.can_talk;

bool cloc2.usable_abilities.can_punch         = military.rules.can_punch         && person.can_punch,
     cloc2.usable_abilities.can_kick          = military.rules.can_kick          && person.can_kick,
     cloc2.usable_abilities.can_drink         = military.rules.can_drink         && person.can_drink,
     cloc2.usable_abilities.can_sit           = military.rules.can_sit           && person.can_sit,
     cloc2.usable_abilities.can_shoot_guns    = military.rules.can_shoot_guns    && person.can_shoot_guns,
     cloc2.usable_abilities.can_talk          = military.rules.can_talk          && person.can_talk,
     cloc2.usable_abilities.can_shoot_cannons = military.rules.can_shoot_cannons && person.can_shoot_cannons;

비트 패턴과 비트 연산자가 사용되는 전형적인 예는 Unix / Linux 파일 시스템 권한입니다.


3
측면에 +1이 문제에 영향을 미칩니다. 그것은 앞서 언급되지 않았다 놀랄
콘래드 Frix을

3
예제는 약간 폭력적인 것처럼 보이지만 다른 답변은 단락에 너무 집중되어 있고 정수와 부울에서 작동하는 것의 차이에 충분하지 않은 것 같습니다.
R0MANARMY

구현 세부 사항 (단락 / 부작용)이 작용하기 전에 기능을 이해해야합니다. 단락이 아닌 부울 대 정수 논리의 주요 차이점을 다행스럽게 생각합니다.
Abel

@ROMANARMY-폭력적이고, 나는 당신의 monkiker가 주어진 아이러니를 좋아합니다. 좋은 일
brumScouse

8

다음의 경우 :

if (obj != null && obj.Property == true) { }

예상대로 작동합니다.

그러나:

if (obj != null & obj.Property == true) { }

잠재적으로 null 참조 예외가 발생할 수 있습니다.


2

짧고 간단한

1 && 2= TRUE
때문에
1 = 참 (비 - 제로) C에서
2 = 참 (비 - 제로)에서 C

trueANDS 논리적으로 true에주고 true.

그러나

1 & 2 이진에서 1 = 0001 2 이진에서 0010
이므로 = 0 = false

0001 AND는 0010과 비트 단위로 10 진수로 0000 = 0을 제공합니다.

마찬가지로 || 와 | 연산자도 ...!


2
-1 : 우리는 여기서 C #에 대해 이야기하고 있습니다 ... C # 1 && 2에서는 불법입니다
Daniel Hilgarth

그러나 이것은 왜 & & & & (많은 사람들이 생각하는 것처럼) 간단하게 교환 없는지를 설명하는 매우 중요한 예입니다 .
bobobobo

1

&&의 단락 버전입니다 &.

우리가 평가 false & true하고 있다면 , 우리는 이미 결과가 거짓이라는 첫 번째 주장을 살펴 보는 것을 알고 있습니다. &&운영자의 버전은 전체 표현식을 평가하는 것이 아니라, 즉시이 할 수있는 결과를 반환합니다. |연산자 의 유사한 버전도 있습니다 ||.


1
if (list.Count() > 14 && list[14] == "foo")

는 안전하다

if (list.Count() > 14 & list[14] == "foo")

목록의 크기가 맞지 않으면 충돌이 발생합니다.


"if (list.Count ()> 14 && list [14] =="대신 "if (list.Count ()> 14 & list [14] =="foo ")"를 쓸 수 있다고 상상할 수 없습니다. foo ")". &는 & 's가 안전하다고해도 간단하고 자연스럽게 &&에 사용할 수 없습니다 (예 : list [1]).
Tien Do

1

C # 연산자 는 이유를 설명해야합니다.

기본적으로이 가진 &의는 또는 |당신이 둘 사이의 차이를 알 수 있도록,이 조건보다는 논리적이다 '의 의미.

& 연산자 에는 하나를 사용하는 예가&있습니다.


두 링크 모두 (효과적으로) 끊어졌습니다 ( "Visual Studio 2005 Retired documentation"으로 리디렉션 ).
피터 Mortensen

1

액면가에서 OK

    Boolean a = true;
    Boolean b = false;

    Console.WriteLine("a({0}) && b({1}) =  {2}", a, b, a && b);
    Console.WriteLine("a({0}) || b({1}) =  {2}", a, b, a || b);
    Console.WriteLine("a({0}) == b({1}) =  {2}", a, b, a == b);

    Console.WriteLine("a({0}) & b({1}) =  {2}", a, b, a & b);
    Console.WriteLine("a({0}) | b({1}) =  {2}", a, b, a | b);
    Console.WriteLine("a({0}) = b({1}) =  {2}", a, b, a = b);

같은 대답을 낳습니다. 그러나보다 복잡한 질문이있는 경우 다음과 같이 표시됩니다.

if (a and b and c and d) ..

만약 a 사실이 아니다 어쩌면 b이 떨어져 가고있는 기능이 무엇인가에 연결하고,이를 얻을 수, 즉, 결정이 .. 왜 귀찮게해야합니까? 시간 낭비, 당신은 이미 실패 압니다. 기계를 끄고 무의미한 작업을하는 이유는 무엇입니까?

&&포인트가 없을 때 계속 진행하기 전에 계산에 실패 할 가능성이 가장 높기 때문에 항상 사용했습니다 . 데이터 출력을 제한하는 부울이있는 경우와 같이 덜 가능성있는 선택을 예측할 방법이없는 경우 다음과 같습니다.

if (limit && !MyDictionary.ContainsKey("name")) 
    continue;

이 아닌 경우 limit키를 확인하지 않아도되므로 시간이 오래 걸릴 수 있습니다.


1

if 문과 같은 논리식에 사용될 경우 &&첫 번째 잘못된 결과가 나 오자마자 식 평가를 중지하기 때문에 선호됩니다. false 값은 전체 표현식이 false가되기 때문에 가능합니다. 비슷하게 (논리적 표현으로)|| true 값을 사용하면 전체 표현식이 true가되므로 표현식이 true가 되 자마자 표현식 평가가 중지되므로 선호됩니다.

그러나 표현은 에드 또는 또는 및-ED가 함께 부작용이 있고, 당신이 (상관없이 논리식의 결과의) 표현식의 결과로 발생하는 모든 이들의 원하는 것을 다음 &|사용될 수있다. 반대로, &&||연산자는 원하지 않는 부작용 (예 : 예외를 발생시키는 널 포인터)을 방지하는 데 유용합니다.

&|연산자는 정수로 사용하고,이 경우 그들은 두 개의 피연산자와 혼성하거나 또는 혼성 비트 레벨에서 함께 정수 결과를 생성 할 수있다. 정수 값의 이진 비트가 true 및 false 값의 배열로 사용될 때 유용 할 수 있습니다. 특정 비트가 켜져 있는지 꺼져 있는지 테스트하기 위해 비트 마스크는 비트 단위로 값과 함께 처리됩니다. 비트를 켜려면 동일한 마스크를 값과 비트 단위 또는 비트 단위로 지정할 수 있습니다. 마지막으로 비트를 끄려면 ~마스크 의 비트 단위 보수 ( )를 사용하여 비트 단위로 값을 지정합니다.

int a = 0; // 0 means all bits off
a = a | 4; // set a to binary 100
if ((a & 4) != 0) {
    // will do something
}
a = a & (~4) // turn bit off again, a is now 000

C # 이외의 언어에서는 &와 |의 논리 대 비트 모드를주의해서 사용해야합니다. 위의 코드에서 if명령문의 조건식 (a & 4) != 0은이 조건을 표현하는 안전한 방법이지만 많은 C와 같은 언어에서 조건문은 정수 0을 정수로, 정수가 아닌 정수를 true로 취급 할 수 있습니다. (이 이유는 사용 가능한 조건부 분기 프로세서 명령어 및 모든 정수 연산 후에 업데이트되는 제로 플래그와의 관계와 관련이 있습니다.) 따라서 ìf0에 대한 명령문 테스트를 제거하고 조건을로 단축 할 수 있습니다 (a & 4).

이로 인해 비트 단위 및 연산자가 비트를 포함하지 않는 값을 반환하여 식을 결합 할 때 혼동이 발생하거나 문제가 발생할 수도 있습니다. 두 함수의 부작용이 모두 필요한지 확인하기 전에 (0이 아닌 값을 리턴하여 정의한대로) 다음 예제를 고려하십시오.

if (foo() & bar()) {
    // do something
}

C에서 foo()1을 bar()반환하고 2를 반환하면 "something" 1 & 2은 0 이므로 수행되지 않습니다 .

C #에는 if부울 oeprand 와 같은 조건문이 필요 하며 언어에서는 정수 값을 부울 값으로 캐스트 할 수 없습니다. 따라서 위의 코드는 컴파일러 오류를 생성합니다. 다음과 같이 더 정확하게 표현됩니다.

if (foo() != 0 & bar() != 0) {
    // do something
}

1

오래된 타이머 C 프로그래머라면 주의하십시오 . C #은 정말 놀랐습니다.

MSDN|운영자에게 다음과 같이 말합니다 .

이진 | 연산자는 정수 유형 과 bool에 대해 사전 정의됩니다 . 일체형의 경우 | 피연산자의 비트 OR을 계산합니다. 부울 피연산자 | 피연산자의 논리합을 계산합니다. 즉, 두 피연산자가 모두 거짓 인 경우에만 결과가 거짓입니다.

(공포는 내 것입니다.) 부울 유형은 특수하게 처리되며,이 맥락에서 질문은 이해하기 시작하고 다른 답변은 이미 설명되어 있습니다.

&&||단락된다. &|평가 모두 피연산자.

선호되는 것은 부작용, 성능 및 코드 가독성과 같은 많은 것들에 달려 있지만 일반적으로 단락 연산자는 나 같은 배경을 가진 사람들이 더 잘 이해하기 때문에 바람직합니다.

이유는 다음과 같습니다. C에는 실제 부울 유형이 없으므로 비트 연산자를 사용하여 |if 조건에서 결과를 진실 또는 거짓으로 평가할 수 있습니다. 그러나 부울 유형의 경우에는 이미 특별한 경우가 있기 때문에 이것은 C #에 대한 잘못된 태도입니다.


0

bool2 (예 :)의 평가 비용은 높지만 bool1은 false 인 경우 && over &를 사용하여 상당한 계산량을 저장했기 때문에 중요합니다.


0

때문에 &&||에 사용되는 흐름 제어 단지 등 if/else이다. 항상 조건에 관한 것은 아닙니다. 으로 쓰는 완벽하게 합리적이다 , 성명 아닌로 if또는 while조건, 다음 :

 a() && b() && c() && d();

또는

 w() || x() || y() || z();

그것들이 동등한 if/else버전 보다 타이핑하기가 쉬운 것은 아닙니다 . 또한 읽고 이해하기가 훨씬 쉽습니다.


0

&& 및 &는 두 가지 매우 다른 것을 의미하며 두 가지 다른 답변을 제공합니다.

1 && 2수율 1 ( "true")
1 & 2수율 0 ( "false")

&&논리 연산자입니다. "두 피연산자가 모두 true이면 true"
&는 비트 단위 비교입니다. "두 피연산자 중 어느 비트가 설정되어 있는지 알려주세요"


2
문제는 C #에 관한 것입니다. C #에서는 숫자를 부울로 변환하는 방법이 없으므로 0은 '거짓'이 아니고 0이 아닌 것은 '참'이 아닙니다. 단순히 동등성이 없습니다.
네이트 CK

숫자를 부울로 변환하려면 1은 true를, 0은 false를 의미하는 방식으로 "n! = 0"이라고 말하십시오 (나는 C #에 익숙하지 않다고 가정합니다). 실제로이 의견은 잘 연구되지 않았기 때문에이 의견을 철회하고 싶었고 이전 의견과 관련이 있다고 생각하지는 않지만 이전 의견과 관련이 있다고 생각하지 않습니다. 가치가있는 모든 것을 위해 여기로 가십시오.
Don Hatch

1 && 2컴파일러 오류 : "오류 4 연산자 '&&'는 'int'및 'int'유형의 피연산자에 적용 할 수 없습니다"
Peter Mortensen

0

이 작업을 수행 할 때 코드의 정확한 작동을 알 필요가없는 사람들에게 이것을 설명하는 가장 빠른 (그리고 약간 바보 같은) 방법은

&& 는 각 조건에 대해 점검을 수행합니다 . 거짓을 발견하고 전체 결과를 거짓으로 반환 할 때까지

|| 이 조건을 확인 하고 전체 결과를 true로 반환 할 때까지

& MATHS 기반 apon BOTH / ALL 조건을 수행하고 결과를 처리합니다.

| MATHS 기반 apon BOTH / ALL 조건을 수행하고 결과를 처리합니다.

나는 & & 또는 | if 문 내에서. 나는 주로 비트 단위 시프트를 사용하여 16 진수 값을 구성 요소 색상으로 자르는 데 사용합니다.

EG :

r = fullvalue >> 0xFF & 0xFF;
g = fullvalue >> 0xF & 0xFF;
b = fullvalue & 0xFF;

이 작업에서 "& 0xFF"는 이진 값만 보도록합니다. 나는 개인적으로 사용을 찾지 못했습니다 | 그래도.


0

간단히,

if exp1 && exp2

exp1이 flase exp2를 확인하지 않으면

그러나

if exp1 & exp2

exp1 false또는 Or true exp2 인 경우

&exp1이 exp2 인 경우 exp2를 거의 확인하지 않기 때문에 거의 사용 하지 않습니다.false

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.