?: 한 식을 비워둘 때 3차 조건부 연산자 동작
나는 시행착오를 통해 숫자를 "가져보려고" 하는 콘솔 어플리케이션을 쓰고 있었는데, 그것은 잘 작동했고, 그것을 제외한 모든 것이 내가 멍하게 쓴 어떤 부분에 대해 궁금하게 만들었다.
코드는 다음과 같다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x,i,a,cc;
for(;;){
scanf("%d",&x);
a=50;
i=100/a;
for(cc=0;;cc++)
{
if(x<a)
{
printf("%d was too big\n",a);
a=a-((100/(i<<=1))?:1);
}
else if (x>a)
{
printf("%d was too small\n",a);
a=a+((100/(i<<=1))?:1);
}
else
{
printf("%d was the right number\n-----------------%d---------------------\n",a,cc);
break;
}
}
}
return 0;
}
좀 더 구체적으로 말하면 나를 혼란스럽게 한 부분은
a=a+((100/(i<<=1))?:1);
//Code, code
a=a-((100/(i<<=1))?:1);
나는 사용했다.((100/(i<<=1))?:1)
을 확실히 하기 위해100/(i<<=1)
전체 식이 1로 평가될 0(또는 거짓)을 반환함((100/(i<<=1))?:***1***)
그리고 나는 그것이 진짜라면 효과가 있을 조건부의 부분을 비워두었다.((100/(i<<=1))? _this space_ :1)
그것은 제대로 작동하는 것처럼 보이지만 조건부의 그 부분을 비워두는 위험이 있는가?
이것은 GNU C 확장자(?: 위키백과 항목 참조)이므로 휴대성을 위해 두 번째 피연산자를 명시적으로 명시해야 한다.
'참'의 경우에는 조건부의 결과를 반환하는 것이다.
다음의 진술은 거의 동일하다.
a = x ?: y;
a = x ? x : y;
유일한 차이점은 첫 번째 진술에 있다.x
항상 한 번 평가되는 반면, 두 번째 평가에서는x
그것이 사실이라면 두 번 평가될 것이다.그래서 유일한 차이점은 평가할 때x
부작용이 있다.
어느 쪽이든, 나는 이것을 구문의 미묘한 사용으로 간주하고 싶다...그리고 만약 당신이 당신의 코드를 유지하는 사람들에 대해 공감한다면, 당신은 피연산자를 명시적으로 진술해야 한다.:)
반면에, 일반적인 사용 사례로는 괜찮은 작은 속임수 입니다.
이것은 C언어에 대한 GCC 확장이다.사이에 아무 것도 나타나지 않을 때?:
그리고 나서 비교의 가치는 실제 사례에 사용된다.
조건부 표현식의 중간 피연산자는 생략할 수 있다.그런 다음 첫 번째 피연산자가 0이 아닌 경우 그 값은 조건식 값이다.
그러므로, 그 표현은
x ? : y
값이 0이 아닐 경우 x 값을 가지며, 그렇지 않을 경우 y 값을 가진다.
이 예는 완전히 와 동일하다.
x ? x : y
이 간단한 경우, 중간 피연산자를 생략하는 능력은 특별히 유용하지 않다.이 방법이 유용해지는 것은 첫 번째 피연산자가 하는 경우 또는 (매크로 인수인 경우) 부작용이 포함될 수 있는 경우다.그런 다음 중간에 피연산자를 반복하면 부작용이 두 번 나타난다.중간 피연산자를 생략하면 이미 계산된 값을 다시 계산하는 바람직하지 않은 효과 없이 사용한다.
'Programing' 카테고리의 다른 글
들여쓰기 #defines (0) | 2022.05.04 |
---|---|
Vuex 비동기식 계산 이미지가 제대로 작동하지 않는 v-carouzl을 사용하여 Vuetify (0) | 2022.05.04 |
읽기() 함수 호출의 시간 초과를 구현하는 방법? (0) | 2022.05.04 |
같은 클래스에서 두 메소드를 동기화하면 동시에 실행될 수 있는가? (0) | 2022.05.04 |
단일 파일 컴프에서 글로벌 Vue 구성 요소에 컨텐츠를 추가할 수 있는가? (0) | 2022.05.04 |