이것은 어떤 언어로든 프로그래머에게 물어 보는 많은 것들과 유사합니다. 저는 여러분이 묻는 것과는 다른 첫 번째 예를 들겠습니다. 그러나 여러분이 보았던 곳이 어디에서 나타나는지 더 잘 설명해야합니다. 이제, '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, 심지어는 a
과 b
). 그것은 명백하게 명백하지 않습니다.
이
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, 똑같은 것을 두 번 말함). 그러나, 당신 뒤에 오는 사람이 그 숫자가 실제로는 두 배가되는 것을 의미한다는 것을 알 수 있습니다.
둘 다 전환입니다. – juanchopanza
C++에서는 적어도 구별이 없습니다. – Brian
두 예제 모두 유형 변환을 포함합니다. '3'은 리터럴 인 'int'이고 '3.0'은 리터럴 인 'double'입니다. – TypeIA