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 ▁true
a
- 평가를 합니다. 지평다니합가않면으를 평가합니다.
expr
하고, " "에 합니다."a
그것을 돌려주세요.
위의 단계는 과제와 일반적인 경우 모두 동일한 것 같습니다.
a ||= expr
하는 등물 단평 인로 a = a || expr
.
가지기 위해a ||= expr
와 같은 기능을 하는.a = a || expr
OP의 주장을 고려합니다.
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
'programing' 카테고리의 다른 글
mariadb에 가상 열 생성 및 case 문 실패 (0) | 2023.06.17 |
---|---|
오류: 기본 자격 증명을 로드할 수 없습니다(Firestore에 대한 Firebase 함수). (0) | 2023.06.17 |
SQL "Join" on null 값 (0) | 2023.06.17 |
파일 또는 어셈블리 'DotNetOpenAuth'를 로드할 수 없습니다.코어 (0) | 2023.06.17 |
document.getElementById("id")는 null일 수 있습니다. (0) | 2023.06.17 |