2014-11-14 2 views
0

난 그냥 장난 정적 변수가 여기 증가 점점되지 않는 이유는 바로이 간단한 코드정적 변수가 범위를 유지하지 못합니까?

int main() 
{ 
    static int Z=500; 
    printf("\n Value of Z is:%d",Z); 
    incrementZ(Z); 
    printf("\n Value of Z is:%d",Z); 
    incrementZ(Z); 
    printf("\n Value of Z is:%d",Z); 
} 

void incrementZ(static int number) 
{ 
    number++; 
} 

을 썼다?

+1

'void incrementZ (정적 정수)'이 컴파일합니까? 너 리눅스에있어? –

+0

vs2013 컴파일 중입니다. –

+0

우. Windows는 MSDN 문서에 따르면 함수 인수에서'static'이 표준 저장 클래스로 대체 될 것입니다. –

답변

2

창문이 열려 있으므로 this link을 확인하십시오.

설명서에 따르면 static은 사용 가능한 표준 저장소 클래스로 대체됩니다. 다음 세 가지 경우가 있습니다.

  1. auto : 식별자가 형식적 매개 변수 또는 지역 변수 인 경우.
  2. extern : 식별자가 함수 인 경우.
  3. 저장 클래스 없음 : 식별자가 전역 변수 인 경우.

그것은 리눅스 GCC에

C4042 : identifier .. has bad storage class

그러나

같은 단지 경고 [C4042]을 말하는 것이 바로 추가를, 생산, 컴파일을 허용 할 것이다,이 complie하지 않습니다.

error: storage class specifiers invalid in parameter declarations

1

Z을 전달하지 않으면 값을 전달한 것입니다. 변수 Z은 범위를 유지하는입니다. 즉 incrementZ에는 사용할 수 없으므로 아무런 변화가 없습니다.

물론 평소와 마찬가지로 &Z을 전달하여이 작업을 수행 할 수 있습니다. 컴파일 안 함수 인수에 static을 갖는 또

는 그 C.

+0

컴파일러 경고 : 번호에 잘못된 저장 공간이 있습니다. 수업? –

1

정적 변수 함수에 파라미터이어야한다 올바르지 않다.

Z은 정적 변수입니다. 따라서 Z의 범위를보아야합니다. function 매개 변수에 정적 저장소 클래스가 있으면 컴파일러에서 오류가 발생하는 것을 볼 수 있습니다.

1

이 프로그램은 Linux에서도 컴파일되지 않습니다. 다음 오류가 발생합니다.

error: storage class specified for parameter ‘number’

정적 변수는 데이터 세그먼트에 저장되지만 함수 인수는 스택에 전달됩니다.

이 경우 오류가 발생하지 않습니다.

0

주소가 아닌 Z 값을 전달하는 중입니다. 함수의 인수도 함수의 구성원입니다. 그래서 int의 범위는 그 함수로만 제한됩니다. 원하는 결과를 얻으려면 다음 코드를 시도하십시오.

int main() 
    { 
     static int Z=500; 
     printf("\n Value of Z is:%d",Z); 
     incrementZ(&Z); 
     printf("\n Value of Z is:%d",Z); 
     incrementZ(&Z); 
     printf("\n Value of Z is:%d",Z); 
    } 

void incrementZ(int *number) 
{ 
    *number=*number+1 
} 

INT의 * 번호는 포인터와 incrementZ (& Z) 당신이 번호로 Z의 주소를 전달하는 것을 의미한다. *는 숫자가 가리키는 값에 액세스하는 데 사용되는 참조 연산자입니다.

관련 문제