programing

C에는 논리적 할당 연산자가 없는 이유는 무엇입니까?

goodcopy 2023. 6. 17. 22:49
반응형

C에는 논리적 할당 연산자가 없는 이유는 무엇입니까?

양식의 진술서를 코딩해야 했습니다.

a = a || expr;

expr평가되어야 하며 결과는 다음에 할당되어야 합니다.a만약에a OR의 기능에 의존합니다이는 논리적 OR의 단락 기능에 의존합니다.

위에 글을 쓰는 더 짧은 방법은 물론,

a ||= expr;

그러나 (놀랍게도) C에는 논리적 할당 연산자가 없습니다.

그래서 제 질문은 두 가지입니다. 첫 번째 C로 더요? (요 - 첫째로, 표준첫 C는문작더있방까삼습니법이짧은나요더빠하성는을째자산연원번▁()삼로▁first?▁is▁c▁in▁-까▁to나▁the▁is▁(요빠▁way▁worse▁standardthe▁there▁statementary▁first▁write -)a = a ? a : expr내가 철자를 쓰라고 요구합니다.a세 번)

두 번째로, C에는 왜 논리적인 과제가 없습니까?제가 생각할 수 있는 이유는 다음과 같습니다.

  • 문법을 해석하는 것을 어렵게 합니까?
  • 이 사건들에 대한 짧은 설명을 다루는 데 약간의 미묘함이 있습니까?
  • 그것은 불필요한 것으로 간주되었습니다 (하지만 그것은 모든 운영자 할당에 대한 논쟁이 아닙니까?)

편집

다음과 같은 이유로 이 질문의 잠금을 해제하십시오.

  • (중복 혐의로) 연결된 질문에 대한 답변이 없습니다. (그 에 인 대 같 다 다 습 니 과 음 대 은 답 된 질 문 한 정 같 다 니 ▁to 습 ▁that ▁the accept 다 인 ▁answer ▁question ▁states▁( ed||=는 의기 능중않존습다니의 .|=그것은 틀린 답입니다. |=단락되지 않습니다.

  • C와 C++는 같은 언어가 아닙니다.저는 C가 왜 그것을 가지고 있지 않은지 알고 싶습니다.사실, C++와 특히 자바와 같은 언어를 파생했다는 사실은 (에드먼드의 답변에서 제안된 것처럼 레거시 코드의 문제로 고통받지 않았다는 것) 질문을 더욱 흥미롭게 만듭니다.

편집 2

지금은 제 원래 의도가 잘못된 것 같습니다.에.a = a || expr서)a이고 는적 고이분고입니다.expr값을 합니다. 두 값 모두를 반환합니다. 먼저 두 값 모두를 반환합니다.a그리고.expr으로 ""boolean"은 "적으로로" "companys" "companys" "companys" 에 됩니다.a이 값은 올바르지 않습니다. 적분 값이 손실됩니다.고마워요, 젠스와 에드먼드

따라서 질문의 첫 번째 부분에서, 대안이 아닌 올바른 방법:)을 코딩하는 것이 제 의도입니다.

if (!a) a = expr;

또는

a = a ? a : expr;

는 개인적으로 첫 더에 그것들은합니다).a입력합니다.

하지만, 그 질문의 두 번째 부분은 여전히 남아 있습니다.젠스와 에드먼드가 제시한 주장은 모호함에 대한 것입니다.a ||= expr에 똑같이 잘 적용되는a = a || expr배정 사례는 일반 사례로 간단히 처리할 수 있습니다.

  • 개종시키다a
  • 참이라면, 인 만그 것 이 참 이 라 면 식 값 부 값 같 과 니 집 아 다 울 은 의 전 약 체 니 다 같 집 ▁if ▁of 아 ▁equal ▁value ▁to ion , ▁becomes ▁the ▁it ▁boolean ▁the 만 ▁of ▁truea
  • 평가를 합니다. 지평다니합가않면으를 평가합니다.expr하고, " "에 합니다."a 그것을 돌려주세요.

위의 단계는 과제와 일반적인 경우 모두 동일한 것 같습니다.

a ||= expr하는 등물 단평 인로 a = a || expr.

가지기 위해a ||= expr와 같은 기능을 하는.a = a || exprOP의 주장을 고려합니다.

a = a || expr 둘 다으로 "booleans입니다.", "로ans"로 변환됩니다.

이것은 완전히 정확하지 않습니다. expr다음과 같은 경우 변환되지 않습니다.a으로 됩니다.true은 이것은차를만것다니입들이다▁this니.expr와유한과 같은 입니다.scanf()또는rand()또는 프로그램 상태에 영향을 미치는 일부 기능.

다음과 같은 코드a ||= scanf("%d", &i) != 1;는 의값 잘못데검합고니다색려하에 하려고 시도합니다.a식으로 하겠지만, 에 추가적인 단락 가 있습니다.||그리고.&&명확한 단순화보다 더 많은 코딩 문제를 야기할 수 있습니다.

반면에, 함수들이 오류 시 0이 아닌 코드를 반환하는, 난독화된 경우, 코드를 빠르게 작성하는 방법입니다.

// Perform functions until an error occurs.
bool error = foo1();
error &&= foo2();  // Only valid if C was extended with &&=
error &&= foo3();

이 연자의 유형이이기 입니다.||그리고.&&왼쪽 인수 유형과 다릅니다.

.||그리고.&& 상항입니다.int왼쪽 인수는 임의의 정수, 부동 소수점 또는 포인터 유형일 수 1있습니다.피연산자가 동일한 유형일 필요도 없습니다.그러므로 정의하는 것은x ||= y~하듯이x = x || y그리고.x &&= y~하듯이x = x && y다른 증강된 할당과 일치하는 것처럼 대부분의 유형에 대한 인수에 결과를 저장할 수 없습니다.

예를 들어, 다른 정의를 생각해 낼 수 있습니다.x ||= y~하듯이if(!x) x = y그리고.x &&= y~하듯이if(!y) x = y하지만 그것은 정확히 명백하지도 않고 그렇게 유용하지도 않기 때문에 포함되지 않았습니다.

1C++에서는 다음과 같습니다.bool.

제 생각에 간단한 대답은||연산자입니다.은 0 10입니다. C에서 "부울"은 0 또는 1입니다.피연산자는 암시적으로 불리언으로 변환되며(스펙이 실제로 그렇게 말하는지 확인하지는 않았지만 C가 어떻게 동작하는지 확인함), 결과는 불리언입니다.

이 패턴을 지원하기 위해 의미를 변경하는 것은 누군가가 의존할 때까지 실현 가능할 수 있습니다.||항상 하던 일을 하는 것.

연산자가 존재하지 않는 특별한 이유를 찾을 수 없습니다(C99).

수 , 그 은 그서래제찾에수 C89이부없고었, 연은오것다니입는다의에, ▁used▁were▁in에만 하려고 했습니다.if

예:

int i = 5;

/* This should not make any difference,
   since or'ing with false, shouldn't change
   the value... dib di dib diddy...*/
i ||= 0; /* Actually: i = i || 0, which gives 'true' */

i이제는 '1'입니다. 대부분의 사람들에게 이는 상당히 역직관적입니다.

이 연산자는 분명히 부울 형식이 없으면 클리어런스나 코딩 개선을 가져오지 않습니다. 이는 다른 유형과 함께 또는 오드가 되는 것을 의미합니다.

제생에각, 은시행의 a ||= b;~하듯이if(!a) a = b;꽤 간단할 것이고 루아와 같은 사람이 이미 구현했습니다.

그래서 당신은 왜 C가 설계된 방식으로 설계되었는지에 대해 약간 의문을 제기하는 것 같습니다.만약 이 질문이 C++에 관한 것이라면, 예를 들어 Bjarne Stroustrup에게 그에게 무슨 일이 있었는지 물어볼 수 있습니다.이것은 사실이 아니기 때문에, 저는 이것이 막다른 골목인 것처럼 보입니다. 왜냐하면 표준은 꽤 오래 전에 작성되었기 때문에 사람들에게 왜 h****인지 더 이상 물어볼 수 없기 때문입니다.

반면에, 이 불완전한 연산자 집합은 (내 생각에는) 당신의 것과 유사한 표기법을 사용하여 이미 완전하게 만들어졌어야 합니다. 왜냐하면, 내 생각에는, 그것에 반대할 이유가 없기 때문입니다.

제가 조금이나마 도움이 되었으면 좋겠습니다.

한 가지 간단한 설명은 이렇습니다.

bool resultsComputeAll = false;
bool resultsUntilFirst = false;
for (int i = 0; i < 10; ++i) {
    resultsComputeAll = compute(i) || resultsComputeAll;
    resultsUntilFirst = resultsUntilFirst || compute(i);
}

게 요?result ||= compute(i)모호해서 정의하지 않는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/3501056/why-does-c-not-have-a-logical-assignment-operator

반응형