윗분말과 동일하게 제가 격어본 언어는 모두 변수의 영역이 있습니다.
함수로 가면 call by reference, call by value 등. 변수의 생존 영역을 잘 파악하는 것이 필요합니다.
ex. 다른 언어 예제. 자바 코드. 출력 결과는 "input"입니다. 설명하기가 그다지 쉽지 않았던 초보적인 문제. C나 C++와는 다르지만.
package some;
public class Scope {
public static void main(String[] arg) {
String a = "input";
doJob(a);
System.out.println("result : " + a);
}
public static void doJob(String a) {
a = "output";
}
}
Programming Language에서 scope(변수 및 함수와 같은 ID가 어느 영역까지 영향을 미칠 수 있는가)의 종류는 크게 Lexical(Static) scoping과 Dynamic scoping이 있습니다. C/C++ Language는 Lexical scoping을 지원하는 언어로 보시면 됩니다.
엄격한 표준에서는 허용하지 않습니다.
visual c 최근버전에서도 안됐던것으로 기억합니다.
$ gcc -pedantic test.c
test.c: In function 'main':
test.c:6:5: warning: ISO C90 forbids mixed declarations and code [-pedantic]
$ man gcc
...
-pedantic
Issue all the mandatory diagnostics listed in the C standard. Some of
them are left out by default, since they trigger frequently on harmless
code.
scope내에서 선언했으니, 당연히 해당
scope내에서 선언했으니, 당연히 해당 scope에서만 사용가능합니다.
밖에서도 사용하고 싶으면 밖에서 선언을 해야겠죠.
c++이라 그런게 아니라, c도 마찬가지입니다. 대부분의 언어가 그러할듯..
scope를 잘 이해하셔야 합니다만.
윗분말과 동일하게 제가 격어본 언어는 모두 변수의 영역이 있습니다.
함수로 가면 call by reference, call by value 등. 변수의 생존 영역을 잘 파악하는 것이 필요합니다.
ex. 다른 언어 예제. 자바 코드. 출력 결과는 "input"입니다. 설명하기가 그다지 쉽지 않았던 초보적인 문제. C나 C++와는 다르지만.
ㅎㅎ
/* filename: weird.cpp */
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int a = 1;
if (a == 1) {
int b;
b = atoi(argv[1]);
}
cout << *(&a + 1) << endl;
return 0;
}
/* compile
* g++ weird.cpp -o weird -Wall
*
* execute
* ./weird 10
*/
참고로.. 이런건 재미삼아 해보는 것이니.. 중요 한 곳에서 이런 짓 하시면..
몸과 정신이 많이 힘들어 지실 꺼에요;;
https://nicesj.com
https://blog.nicesj.com
참고로
Programming Language에서 scope(변수 및 함수와 같은 ID가 어느 영역까지 영향을 미칠 수 있는가)의 종류는 크게 Lexical(Static) scoping과 Dynamic scoping이 있습니다. C/C++ Language는 Lexical scoping을 지원하는 언어로 보시면 됩니다.
www.gilgil.net
그리고 제 기억으로는
C언어에서는 function의 제일 앞부분에서만 변수의 선언이 가능하고, function body 중간에서는 선언이 되지 못하는 것으로 알고 있습니다.
반면에 C++에서는 block(brace로 둘러 싼) 어느 곳에서도 변수의 선언이 가능합니다.
www.gilgil.net
function의 앞부분이 아니라, block의
function의 앞부분이 아니라, block의 앞부분이죠..
-_-!
순수 C 컴파일러에서 function 앞부분이 아닌 block 앞부분에서 variable 선언이 가능한가요?
네
네
순수 C 컴파일러에서 function 중간 부분에도
순수 C 컴파일러에서 function 중간 부분에도 변수 선언이 가능합니다. 구닥다리 컴파일러만 쓰지 않는다면.
음 ..
ANSI C (ISO C90) 에서는 block 의 맨 첫 부분에서만 변수 선언이 가능하고..
C99 에서는 임의의 위치에서 변수 선언이 가능합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
음.. 지금 테스트해 보니
gcc version 4.4.5 임돠.
www.gilgil.net
gcc에서 임의 위치 선언이 되는
gcc에서 임의 위치 선언이 되는 것은
gcc확장때문으로 알고 있습니다.
엄격한 표준에서는 허용하지 않습니다.
visual c 최근버전에서도 안됐던것으로 기억합니다.
비주얼 스튜디오의 C컴파일러는 구닥다리이기 때문이죠.
비주얼 스튜디오의 C컴파일러는 구닥다리이기 때문이죠. 2010조차도. C99가 들어가있지 않아요.
gcc확장이 아니고 그냥 표준이에요.
http://en.wikipedia.org/wiki/C99
GPLv2가 여전히 많이 쓰이듯, 지나간 버전의
GPLv2가 여전히 많이 쓰이듯, 지나간 버전의 표준이라고 해서 표준이 아닌건 아닙니다.
"GCC에선 확장으로 미리 지원했었고 C99에서 정식으로 추가된 부분이다" 정도면 될것 같네요.
int _tmain(int argc, _TCHAR*
이건 어떤가요? 내부에서 선언된 non static 지역변수 x의 상태를 유지하며 바깥에서 사용합니다.
아, 물론 재미삼아 써본 것이고 질문에 대한 답이라는
아, 물론 재미삼아 써본 것이고 질문에 대한 답이라는 뜻은 아닙니다^^
이건 무슨 언어죠? c++같이
이건 무슨 언어죠?
c++같이 생긴것이...특이하네요.
lambda 함수를 지원하는듯한...
이 언어의 이름은 새로 태어난 C++입니다. 정식
이 언어의 이름은 새로 태어난 C++입니다.
정식 명칭은 C++11 이죠.
댓글 달기