2014-08-28 4 views
1

다음 코드에서 첫 번째 if의 값을 가져 오면 0이므로 false입니다. 그래도 출력 결과는 "float"로 인쇄됩니다. 단락의 결과입니까? 그렇다면, 왜 "정상적인"경우, sizeof 연산자가 '=='와 함께 사용되지 않을 때 발생하지 않습니까?조건부 연산자

#include<stdio.h> 
int main() 
{ 
    int x=1; 
    short int i=2; 
    float f=3; 

    if(sizeof((x == 2) ? f : i) == sizeof(float)) 
     printf("float"); 
    else if(sizeof((x == 2) ? f : i) == sizeof(short int)) 
     printf("Short int"); 
} 

답변

0

문제는 sizeof((x==2)?f:i)이 인수의 정적 유형 크기를 반환한다는 것입니다. 인수가 (x==2)?f:i이고 조건이 true가 아니더라도 float 유형입니다. 이는 표현식 유형이 런타임 중에 설정되지 않았지만 컴파일 중에 있기 때문입니다.

3

operator?:의 결과는 선택된 피연산자에 관계없이 동일한 유형이어야합니다. 이 경우 첫 번째 ?:의 결과는 ifloat으로 변환되므로 크기는 float과 동일합니다.

우리 §6.5.15/5의 종류를 결정하는 정확한 방법을 볼 수

두 번째 및 세 번째 피연산자 산술 형 통상 결정 될 것이다 결과 유형이 있다면 산술 변환은 두 피연산자에 적용 되었습니까? 결과는 입니다.

일반적인 산술 변환에 이상 건너 뛰기, 관련 텍스트는 §6.3.1.8/1 인 : 그렇지 않으면

, 피연산자의 대응 실제 자료형이 소수 인 경우, 다른 피연산자가 변환된다 유형 도메인의 변경없이 해당 실제 유형이 float 인 유형으로 변환합니다.

여기 있습니다.

3

sizeof은 피연산자를 실행하지 않으며 컴파일 타임 연산자이기 때문에 어쨌든 비정 수 값으로 분기 할 수 없습니다.

sizeof((x == 2) ? f : i)(x == 2) ? f : i의 결과 유형의 크기입니다. 조건부 연산자는 short을 실행하면 float으로 승격되므로 전체 sizeof 표현식은 sizeof(float)과 같습니다.

+0

프로모션이없고 UAC 만 있습니다. – chris

+1

*이 지점을 수행하려면 관리자 권한이 필요합니다 *. 응. – Quentin

+0

하. 나는 여전히 Windows 이전에 C++과 연관시키는 작업을하고 있습니다. – chris