2016-10-24 3 views
0

"="부호의 오른쪽에 수학 연산을 사용하여 전역 변수를 초기화 할 때 컴파일러는 무엇을합니까?전역 변수 초기화의 수학 연산은 컴퓨터가 무엇을합니까?

예 : 프로그램 (191) = 반환해야

int global1=75; 
int global2=32+84; 
int global3=(global1+global2); 

int main(){ 
return global3; 
} 

(75 + (32 + 84)) 내가 모르는 것은 결과가 컴파일시 또는 런타임에 계산되는지 여부를

+3

[유효하지 않은 C] (https://ideone.com/NB6oJ0). –

+0

죄송합니다. 태그가 수정되었습니다. 감사! –

답변

2

32+84은 컴파일러가 모든 변수의 값을 알지 않고도 값을 계산할 수있는 산술 표현식에 대한 C 및 C++ 표준 모두의 용어 인 "상수 표현"입니다 . 상수 표현식이

int global2=32+84; 

기술적으로도는 C 나 표준 C++에서와 같이 전역 변수를 초기화하는 데 사용되는 경우 은 또한 필요로 컴파일 시간에 평가할 수 있지만 하드 누를 것 그렇게하지 않은 컴파일러를 찾으십시오. (컴파일러가 컴파일 타임에 상수 표현식을 실제로 평가해야하는 다른 상황이 있으므로 항상 코드를 작성해야하므로 항상 수행해야합니다.)

global1+global2은 "상수 표현". C에서는 전역 변수를 초기화하는 데 사용할 수 없다는 것을 의미합니다. 컴파일 타임 오류가 발생합니다. C++에서 허용되는 것은 컴파일 시간 또는 런타임에 추가되는지 여부입니다. 유일한 보장은 main이 실행되기 시작하여 global3이 올바른 값을 갖게된다는 것입니다. 특히 이 아닌은 전역 객체의 생성자에서 관찰 된 경우 올바른 값을 가질 수 있습니다.

은 C++을 (

을 (경험적으로는, g ++ 6. ++ 3.9 둘 가능성이 실제로 발생할 않는 것을 확인 컴파일시에, 그것을 수행을 연타 반면 런타임 global3 대한 값을 계산한다)하지만 하지에서 global1global2 모두 const 선언 된 경우 C, global1+global2는 상수 표현으로 간주됩니다.)

+0

이 답변은 더 좋습니다 :) – nephi12

0

당신이 그것을 실행하는 실제 코드를 필요로, 나는 global3 런타임에 계산 믿고 C++를 의미합니다. 이것은 동적 초기화라고하며, C는 is를 지원하지 않지만 C++은 그렇다고 믿습니다. c와 C++ 둘 다 실제 값이 디스크에 저장되어 있기 때문에 global1과 2가 정적 초기화를 허용합니다. 누군가가 당신에게 설탕과 소금이 필요하다고 말하는 요리법을 제공하고 그것을 섞은 다음 밀가루를 넣으면 조리법을 사용하기를 기다리는 동안 혼합 설탕과 소금을 저장할 것인가? 아니, 당신은 "런타임"에서 믹싱을합니다. 그러나 준비 과정에서 설탕과 소금을 사면 혼동하지 않습니다. 설탕과 소금은 global1과 2이고, 혼합물은 global3입니다.