C & C++/C 15

[C] C language의 연산자 우선순위는 설계 실수인가?

최근 흥미로운 내용을 접했다. C language의 연산자 우선순위에 설계상 결함이 있다는 이야기다. 전설의 C에 언어 설계 결함이 있을 수 있나? 라는 생각이 들었다. (지금도 결함 정도로 생각되진 않지만) 내용은 이렇다. & | 연산자와 == 연산자 간의 연산자 우선 순위로 인해 실수할 여지가 크다는 내용이다. & | 보다 ==의 연산자 우선순위가 더 높기 때문에 문제가 될 수 있다고 한다. 아래 코드가 있다고 보자. if (a & b == c) { // ... } 위 코드는 a&b의 결과가 c와 동등한지 확인하는 코드가 아니다. 오히려 b==c가 먼저 평가되고 그 결과와 a와 bit and를 한다. (당연히도) 해당 의견을 접하고 먼저 든 생각은 이렇다. 이게 왜 설계상 오류일까? 연산자 우선순위가..

C & C++/C 2024.01.01

[C] 환경변수를 출력하는 envp의 미스터리한 동작 발견. 이유가 대체 뭘까요? <extern char ** environ;> (1)

야밤에 치킨을 먹고 쉬던 와중에 친구에게 연락이 왔다. 그리고 친구와 오랜만에 c 코드를 잠깐 살피게 되었다. 간단한 코드인데 어떻게 제출할지가 살짝 애매해서 고민하고 있었다. 방법을 찾으려고 이것 저것 건드려보면서 30분은 떠든것 같다. 그러다가 굉장히 납득하기 어려운 동작을 하는 코드가 탄생했다. 아무리 생각해도 이해가 가지 않는 동작이라 조금만 더 살펴볼까 한다. 분명 우리가 모르는 무언가가 있을 것이라고 생각하고 이리저리 살펴봤는데도 그럼에도 불구하고 신기한 코드이다. 이제부터 설명을 하도록 하겠다. 우선 우리의 목적은 간단하다. /usr/bin/env 는 환경변수를 모두 출력시키는 동작을 한다. 그리고 우리는 그 환경변수에 ENV1=value1, ENV2=value2 라는 path 또한 추가해서..

C & C++/C 2022.04.13

[C] C언어 질문: 두 배열 a와 b에서 b = a 에서 에러가 발생하는 이유는 무엇일까?

새벽에 누군가가 재밌는 질문을 올려놨다. 짧은 글이라 그냥 휙 보고 넘기려 했다. 그런데 글을 보고 고민했는데 나도 감이 잡히질 않아서 아침에 직접 dev C++를 켜고 값을 찍어보았다. 올라온 질문은 다음과 같았다. 배열은 포인터와 유사하지만 포인터 상수이다. 즉 대입이 불가능하다. 근데 왜 전자의 경우에선 오류가 나지 않고 후자의 경우에서 오류가 발생하는가? void function(int a[]){ int b[5]; a = b; } void main(){ int a[10]; function(a); } void main(){ int a[10]; int b[4]; b = a; } 배열은 배열의 첫 번째 요소의 주소값을 가지고 있는 것이다. 배열 변수는 주소값을 받을 수 있으니 b = a; 와 같이 만든..

C & C++/C 2021.11.21

[C] 포인터가 가질 수 있는 값인 nil이란?

포인터가 가질 수 있는 값들 중에 nil이 있다는 글을 봤다. null의 오타겠거니 생각했다. null을 잘못적었구나 라고 생각했는데 실제로 nil이라는 걸 사용한다고 한다. swift에서 null대신 nil을 사용한다고 한다. 즉 swift에서는 null이없어서 그대신 nil이라는 개념을 쓴다고 한다. 그리고 사실 nil의 기본적의 정의 자체는 꼭 스위프트에서만이 아니라 "다양한 컴퓨터 프로그래밍 언어에서의 널포인터의 이름" 라고 정의된다. 즉 별다른거 없다. 그냥 null 인거다. 다만 다르게 부를 뿐이다. 그러니 앞으로 어떤 랭귀지든 nil이라는게 나오면 아 여기서는 null대신 이걸 쓰는구나 라고 알면 되겠다.

C & C++/C 2021.10.17

[Linux] exit과 _exit의 차이

리눅스 시스템 프로그래밍을 할적에 _exit을 본적이 있는데 exit은 main문제에서 쓰이는 반면 _exit은 자식 프로세스의 동작이 확실시되는 곳에서 사용되는 경우가 있었다. 둘 사이의 차이가 사후처리 즉 뒤처리를 하고 종료하느냐 하지 않느냐의 차이로 알고 있었는데 자식 process에서 쓰이는걸 보면 뭔가 이유가 있겠다 싶었다. 아래가 해당 자세한 내용이다. exit() 함수는 표준 입출력 정리 루틴을 수행하고 _exit()를 호출한다. exit() 함수는 파일 스트림에 대해서 동일한 작업을 수행하는데, 열려있는 파일의 스트림에 대해서는 fclose() 함수를 호출해서 버퍼에 남은 데이터를 모두 출력(flush)한다 일반적으로 _exit() 함수는 표준 입출력과 관련된 정리 작업을 수행하지 않는 것..

C & C++/C 2021.10.12

[C] 메모리와 변수의 lifetime으로 인한 예상치 못한 결과 -> (해결)

글 앞 내용에 잘못된 내용이 등장합니다. 혼자서 추측했던 내용이라 잘못된 내용인데 그냥 결과만 확인하고 싶은 분은 글 맨아래로 가셔서 파란색 문단을 읽으시면 됩니다. 굉장히 신기한 내용을 접하게 되었다. 우선 아래 코드를 먼저 보면 아주 간단한 코드인데 척 보면 무슨 결과가 나올지 짐작일 갈 것이다. #include int fun() { static int count = 0; count++; return count; } int main() { printf("%d ", fun()); printf("%d ", fun()); return 0; } 위와같은 코드를 봤을때, 딱 보면 아 static으로 선언되있기는 한데 그런데 어차피 다시 또 0으로 초기화를 해주기 때문에 결과가 1 1 이 나오겠구나라고 생각할 ..

C & C++/C 2021.10.08
반응형