Programing

?: 한 식을 비워둘 때 3차 조건부 연산자 동작

c10106 2022. 5. 4. 19:15
반응형

?: 한 식을 비워둘 때 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

이 간단한 경우, 중간 피연산자를 생략하는 능력은 특별히 유용하지 않다.이 방법이 유용해지는 것은 첫 번째 피연산자가 하는 경우 또는 (매크로 인수인 경우) 부작용이 포함될 수 있는 경우다.그런 다음 중간에 피연산자를 반복하면 부작용이 두 번 나타난다.중간 피연산자를 생략하면 이미 계산된 값을 다시 계산하는 바람직하지 않은 효과 없이 사용한다.

참조URL: https://stackoverflow.com/questions/3319075/ternary-conditional-operator-behaviour-when-leaving-one-expression-empty

반응형