2014-02-16 3 views
0

캐스트는 유형 변환과 모호성 제거 둘 다에 사용됩니다. 추가 연구에서 나는이 두 가지를 예제로 발견했습니다.유형 변환 vs 유형 모호성

(double) 3; // conversion 
(double) 3.0; // disambiguation 

누군가가 차이점을 설명 할 수 있습니까? 부동 소수점 리터럴 현대 컴파일러에 더 이상 float을 없기 때문에

(float) 3; // conversion 
(float) 3.0; // disambiguation 

그러나 double에 변경 :이 구별은,

는 원래 코드가 너무 같았다 C++

편집에서 유효합니다 그 질문은 의미가 없었다. 나는이 주석을 올바르게 해석하고, 편집 후에 관련성이 없어지는 이미 게시 된 답변을 사과하길 바란다.

+4

둘 다 전환입니다. – juanchopanza

+4

C++에서는 적어도 구별이 없습니다. – Brian

+0

두 예제 모두 유형 변환을 포함합니다. '3'은 리터럴 인 'int'이고 '3.0'은 리터럴 인 'double'입니다. – TypeIA

답변

0

이것은 어떤 언어로든 프로그래머에게 물어 보는 많은 것들과 유사합니다. 저는 여러분이 묻는 것과는 다른 첫 번째 예를 들겠습니다. 그러나 여러분이 보았던 곳이 어디에서 나타나는지 더 잘 설명해야합니다. 이제, 'A는'무엇을

static const a = 5; 

입니다 :

내가 상수 변수를 정의 말? 다시 시도해보십시오 ...

static const max_number_of_buttons = 5; 

이것은 명시적인 변수 이름입니다. 그것은 훨씬 길어 장기적으로 당신의 엉덩이를 구할 가능성이 있습니다. C++에서는 멤버 변수의 이름 지정과 로컬 변수 및 매개 변수 변수의 두 가지 잠재적 인 문제가 있습니다. 모두 3은 다른 체계를 사용해야하므로 C++ 함수를 읽을 때 정확히 무엇을하는지 알 수 있습니다. 이 변수에 대해 당신에게 아무것도 알 수없는 작은 함수입니다 :

void func(char a) 
{ 
    char b; 
    b = a; 
    p = b * 3; 
    g = a - 7; 
} 

적절한 명명 규칙을 사용하여이 당신은 p와 g가 지역 변수, 함수에 대한 매개 변수 구성원 또는 전역 변수인지 알게 될 것입니다. (이 함수는 매우 작기 때문에 생각해 보았습니다. 코드 1,000 라인의 함수를 상상해보십시오. 몇 페이지가 지나면 무엇이 무엇인지 알지 못하며 실제로 그림자 변수를 실제로 볼 수 있습니다. 디버그하기가 어렵습니다 ...)

void func(char a) 
{ 
    char b; 
    b = a; 
    g_p = b * 3; 
    f_g = a - 7; 
} 

내 개인적인 규칙은 전역 변수에 g_ 및 변수 멤버에 f_을 추가하는 것입니다. 이 시점에서 나는 지역 변수와 매개 변수를 구별하지 않는다 ...매개 변수 대신에 p_a를 쓸 수는 있지만 지금은 모든 다른 유형의 변수를 알 수 있습니다.

그래, 그렇다면 변수 이름의 모호성 제거와 관련하여 알기 쉽습니다. 어디 보자 ...

Ada는 매우 강력한 변수 유형 지정으로 유명합니다. 예 :

type a is 1 .. 100; 
type b is 1 .. 100; 

A: a; 
B: b; 

A := 5; 
B := A; 

마지막 줄이 컴파일되지 않습니다. 유형 a와 유형 b가 비슷하게 보일지라도 컴파일러는 둘 다 다른 숫자 유형으로 봅니다. 다른 말로 표현하자면, 그것은 명백합니다. 이 에이다에서 작동하게하려면 다음과 같이 캐스팅해야합니다 :

B := B'(A); 

, 당신은 두 가지 유형의 변수를 선언 C/C++에서 같은 :

C에서와 같이 작동
typedef int a; 
typedef int b; 

a A; 
b B; 

A = 5; 
B = A; 

/C 타입은 a 타입이고 b 타입은 정확하게 동일하다고 간주되기 때문에 (int, 심지어는 ab). 그것은 명백하게 명백하지 않습니다.

A = (b) 5; 

명시 적으로 5과 B 형의로 변환하는 것이 볼 것을 당신에게 말할 것 (암묵적으로) 할당에 입력하기 : 그래서 뭔가를 작성. 당신은 또한 완벽하게 명시 적으로이 방법을 쓸 수있다 :

A = a(b(5)); 

대부분의 C/C++ 프로그래머가 불행히도, 이것은 우리가 우리의 소프트웨어에 많은 버그가 이유입니다, 바보 있음을 알려드립니다. Ada는 당근과 바나나를 섞지 않도록 보호합니다. 둘 다 정수로 정의 되더라도 둘 다 다른 유형이기 때문입니다.

이제는 C/C++에서 그 문제를 경감하는 방법이 있습니다. 사용하지는 않았지만 숫자를 포함하여 각 객체에 대해 클래스를 사용할 수 있습니다. 그렇다면 클래스 A와 클래스 B의 변수는 목적에 맞는 함수를 추가하여 허용하지 않는 이상 서로 섞일 수 없기 때문에 각기 다른 유형에 대해 특정 유형을 갖게됩니다. 솔직히 말해서, 나는하지 않습니다. 그것은 어떤 길이의 C 프로그램을 작성하는 데 너무 많은 작업이 될 것이기 때문에 ...

그래서 Juri가 말한 것처럼 3.0과 (double) 3.0은 똑같은 것이고 (double) casting은 중복됩니다. pleonasm, 똑같은 것을 두 번 말함). 그러나, 당신 뒤에 오는 사람이 그 숫자가 실제로는 두 배가되는 것을 의미한다는 것을 알 수 있습니다.

2

(double) 3은 정수 (int)에서 floting 포인트 번호 (double) 로의 변환입니다.

(double) 3.0의 캐스트는 쓸모가 없습니다. 이미 double이므로 아무 것도하지 않습니다.

접미사가 붙지 않은 부동 소수점 형은 double 유형입니다.

(ANSI 표준 C, §3.1.3.1 부동 상수)

이 C 응답이 유효, 이는 C++에서 동일해야한다.