programing

C 조건부 연산자('?')(두 번째 매개 변수가 비어 있음)

topblog 2023. 7. 7. 18:27
반응형

C 조건부 연산자('?')(두 번째 매개 변수가 비어 있음)

일반적으로 '?' 연산자는 다음 형식으로 사용됩니다.

A ? B : C

그러나 B = A 다음과 같은 약어를 본 경우

A ? : C

이것은 놀랍게도 효과가 있습니다.두 번째 매개 변수를 (스타일에 따라) 그대로 두는 것이 좋을까요, 아니면 특정 컴파일러가 이를 처리하지 못할 가능성이 있을까요?

C 언어에서는 허용되지 않지만(제가 알기로는) gcc와 같은 컴파일러는 바로 가기 a?:c를 확장자로 가지고 있습니다. a?:c와 같은 의미입니다.a?a:c.

그것의 agcc의 내선 번호.

생략된 피연산자가 있는 조건

x ? : y와 동등합니다.x ? x : y

내가 크게 틀리지 않는 한, 당신은 컴파일러 확장자(추정치: gcc)를 사용하고 있습니다.저는 이 표준이 3항 연산자에 대한 두 번째 피연산자를 생략하는 것을 허용하지 않는다고 확신합니다.

제가 조금 채워드립니다.

이 표준에서는 조건 연산자라는 용어를 사용합니다.

구문
  조건부 표현:
논리적 논리적 표현논리적 논리적 표현?식 : 조건식

조건식은 n 값을 산출하지 않습니다.또한; 위키백과; 조건부

참고: 예:C++은 다음을 포함합니다.
논리적-OR-표현식 ?식 : 할당-표현식

제약 조건:
첫 번째 피연산자는 스칼라[1] 유형을 가져야 합니다.
다음 중 하나가 두 번째 및 세 번째 피연산자에 대해 유지되어야 합니다.
두 피연산자 모두 산술[2] 유형을 가집니다.두 피연산자 모두 동일한 구조[3] 또는 조합[4] 유형을 갖습니다.두 피연산자 모두 보이드[5] 유형을 가집니다.두 피연산자는 모두 정규화된 버전 또는 정규화되지 않은 버전의 호환성에 대한 포인터입니다.유형[7];
한 피연산자는 포인터이고 다른 피연산자는 널 포인터[8] 상수입니다. 또는한 피연산자는 객체 또는 불완전한[9] 유형에 대한 포인터이고 다른 피연산자는void의 정규화된 버전 또는 정규화되지 않은 버전에 대한 포인터입니다.

풋푸드:

[1] 스칼라 유형 : 산술 유형 및 포인터 유형입니다.[2]산술 유형 : 정수형과 부동형입니다.[3]구조물 유형 : 비어 있지 않은 멤버 개체 집합(및특정 상황, 불완전한 배열), 각 상황은 다음과 같습니다.선택적으로 지정된 이름과 고유한 유형일 수 있습니다.[4]Union type : 비어 있지 않은 구성원 개체의 중복 집합으로, 각 개체는선택적으로 지정된 이름과 고유한 유형입니다.[5]void type : 빈 값 집합입니다. 이 형식은 다음과 같을 수 없는 불완전한 형식입니다.완료된.[6]적격유형 : 1998년(상수, 휘발성), 1999년(제한)2011(_Atomic).*
[7]Compatible type : 동일한 유형입니다.[8]null ptr.const.NULL. 구현 정의된 Null 포인터 상수입니다.[9]불완전한 유형 : 개체를 설명하지만 결정하는 데 필요한 정보가 부족한 유형그들의 치수

* C에 한정자 입력

그래서: 사용하는 것은 현명하지 않습니다.

위키피디아에 따르면, 저는 웹에서 약간의 조사를 했습니다, 이 행동은 C의 GNU 확장에 의해 지원됩니다. http://en.wikipedia.org/wiki/%3F :#C

따라서 다른 컴파일러가 이를 불법으로 간주할 가능성이 매우 높습니다.그런데 이 연산자는 3차 조건부 연산자라고 해서 검색할 수 있습니다.

편집:

gcc와 apple llvm을 확인해보니 정상적으로 작동합니다.

두 번째 매개 변수는 그대로 두는 것이 좋습니다.Bever가 변경되면 위의 문장을 수정하는 것을 기억하지 못할 수 있습니다.또한 B를 문에서 제외하면 다른 사람들이 당신의 코드를 읽고 개선하는 데 어려움을 겪을 수 있습니다.

언급URL : https://stackoverflow.com/questions/10143125/c-conditional-operator-with-empty-second-parameter

반응형