//01. 타입의 명시에 대한 간과 그리고 나눗셈 /...
위와같은 코드에서 출력된 값은 10.000000이다.
이는 변수 c의 타입이 float인데, float은 단순히 소수점이 있다 정도로 이해하고 그냥 주어진 문제풀이에 대해 알량하게만 인식했던 거 같다.
float는 소수점 6자리까지 나타낸다는 부분을 당시에는 무시하고, 그저 소수점을 나타낸다 정도로 이해하고 무시했던 거 같다.
피연산자 모두 위의 코드에선 정수이기에, 나눗셈 연산해서 버려지는 것도 정수 부분만 남는다.
나는 '/'를 정수만 해당하기 때문에, 어떤 전혀 상관없는 이론과 섞였는지 이상하게 받아들여지고, 그걸 토대로 코드 해석에 적용했었다.
만약 위의 코드에서 올바르게 출력되도록 한다면, 짚고 넘어갈 개념이 있기에, 다시 되새겨보고자 한다.
- 피연산자 중에서 하나가 실수이면, 실수 계산 하드웨어를 사용하여 계산을 하기 때문에 나눗셈 연산의 결과도 실수가 된다.
- 만약 피연산자가 정수와 정수일 경우, 정수의 타입을 변환하는 '형변환'을 시켜야 한다.
즉, 그러한 개념을 다시 되새겨 코드를 작성한다면, 위와같이 수정하면 된다. 사소한 개념일지라도 다시 한번 제대로 파악하자!
그리고 하나 놓쳤던 것중 하나가 '/'이었다. 나눗셈 연산자와 헷갈렸던 건 나머지 연산자였다.
%(나머지 연산자)는 정수형 전용이다! 나눗셈이 아닌 나머지 연산자가 정수끼리만 사용가능하다는 걸 제대로 다시 기억하자!
//02. 논리 연산자에서 !a
논리 연산자에서 !a의 '!'는 "NOT 연산, a가 참이면 거짓, 거짓이면 참"이라는 의미이다.
그렇다면 만약 !가 여러개가 중복되어 있다면, 출력은 어떻게 될까?
이걸 배웠을 당시에는 참거짓이라는 걸 바로 이해하고 했었으나, 막상 마주했을 때는 달랐다.
NOT의 NOT은 다시 원상복구된다(?)로 기억됐는지, 거짓이 참으로 된다라는 의미와는 전혀 다르게 간과하고 있었다는 걸 짚을 수 있었다.
다시 한번 더 짚고 넘어가자. !a (만약 a가 0이 아닌 어떤 실수라면) 거짓 = 0
그리고 거기서 !을 한다면, 거기서 부터는 참 혹은 거짓에 대한 출력값이 나온다는 거!
//03. 복합대입연산자과 여러 연산자들을 동시에 마주했을 때
위의 코드를 순간 마주하였을 때, 일단 제일 먼저 보였던 건 소괄호였다.
소괄호는 어떤 연산자든 뭐든 제일 1순위로 처리를 한다고 이해를 해왔기 때문에, 거기서부터 다루기 시작했다.
하지만 뭐랄까? 그 뒤부터가 내가 잘못 처신했다.
'+='는 복합대입연산자이기에, a+=7은 즉, a=a+7이라는 말이며, a+7을 a에 대입한다는 의미이다.
하지만 나는 당시에 if 조건에 충족되어야 한다?는 것에 꽂혀서인가.. 결국 그냥 겉부분만 맴돌다 문제를 풀었던 거 같다.
가령, if 조건이 충족되면, a가 후위증가가 된다!라고만 넘어가다 보니, 복합대입연산자를 한 걸 토대로 출력값에 영향을 준다는 걸 미처 자각하지 못했던 것이다.
즉, 나는 그저 if가 조건이 참이 아닌 거짓이니, a==7로 간과하고 처리하여, 엉뚱한 출력값을 작성해버린 것이다.
위의 코드 예제는 내가 무엇이 부족하고 어떻게 풀어야 하는지에 대해 짚고 넘어갈 좋은 코드라고 본다.
결국엔 위의 코드를 풀어본다면, 처음 (a가 7을 넣으니 14)_ 거짓 && 그리고 뒤에도 거짓.. 하지만 && 논리 연산자는 앞이 거짓이면 뒤에는 무시되고 하기에,
a= 14, b = 7해서 결과는 21 값이 나오게 되는 것이다.
하지만, &&연산자가 아닌 || 연산자인 경우,
OR(논리합)연산자는 둘 중 하나가 참이면 참이다. 하지만 위의 코드도 둘 다 거짓이긴 하나, b의 복합대입연산자까지 무시되지 않고 과정을 밟았기 때문에, a = 14, b = 14 그러하여 출력값은 아래와 같이 28이 나오게 된다.
나는 그당시엔 '산술연산자 > 관계연산자 > 논리연산자' 우선순위 여기에만 매달리다 보니, 큰 부분만 보았지, 세세한 부분은 제대로 살피지 못한 알량함을 위의 코드를 통해 다시 짚고 넘어갈 수 있었다.
//04. 비트 이동 연산자(<<,>>) 및 배우지 않은 범주를 대함에 있어서..
비트 이동 연산자에 대해선 수업시간에는 배우지 않았던 범위였다. 하지만 여기에 나온 내용들은 실무에선 모르는 게 없어야 한다는 걸 본다면, 누가 보라고 굳이 말하지 않더라도 보고 이해라도 해야하는 자세를 가져야지 않나 싶었다.
가르쳐주지 않는 내용은 테스트에 속하지 않는다는 잣대로 코드를 대하다보니, 막상 테스트에서 이와같은 막힘을 적나라하게 받게 되었다.
문제를 맞췄다 틀렸다의 부분을 떠나서, 내가 지금 C언어를 배워가며 역량을 쌓는 와중에 있어서 빈틈이 곳곳에, 그리고 개발 분야에 신입으로 들어가는 입장에 있어서 더 열심히 해야지 않나는 냉철한 시각도 갖게 되었다.
이번 산술연산자 및 선택제어문(조건문)을 테스트를 통해, 나는 알았다고 한 건 겉핥기식으로 아는 정도였지 빈틈 투성이었다.
그리고 제대로 아는 것도 아니었다. 앞으로 뒷파트로 가면갈수록 앞에서 배웠던 개념과 원리들이 토대를 갖고 나아가야 하기에, 코드를 다양하게 직접 타자로 치면서, 오늘 놓쳤던 건 이와같이 정리하며 익히는 시간을 스스로 가져 놓치는 게 되도록 없도록 노력해야겠다.
비트 이동 연산자에 대해 간략하게 짚고 넘어가자면, <<, >>
왼쪽 비트 이동 연산자인 <<는 지정된 횟수만큼 전체 비트 패턴을 왼쪽으로 이동하며, 이때 왼쪽으로 이동되어서 변수의 경계를 벗어나는 비트들은 없어지게 되고 오른쪽에 발생하는 빈 공간은 0으로 채워지게 된다.
간략히 말하자면,
<<(왼쪽으로 이동)_지정된 개수만큼 모든 비트를 왼쪽으로 이동한다.
>>(오른쪽으로 이동)_지정된 개수만큼 모든 비트를 오른쪽으로 이동한다.
즉, b의 값이 11인데, 이진수로 변환하면, 1011(2)이다. 하지만 위의 코드에선 오른쪽으로 2칸 이동이라 한다면, 10(2)가 됨으로 출력값은 2가 된다.
한마디
이번에 테스트를 받으며 크게 느꼈던 건, 받았을 때, 새하얗게 된 상태가 솔직히 말해 내 상태임을 보게 됐다. 제 아무리 꾸역꾸역 어떻게 낑겨세웠을지라도 작은 힘을 가하면 금새 후두둑 무너져 내린다는 건, 흐지부지하게 아는 정도밖에 되지 않았음을 직시해야할듯 싶다. 매번 봐둔 문제들을 풀다보니 익숙해지고 손에 익은 거지, 그게 내가 뼈속까지 이해했다고 착각해선 아니된다.
'XR개발 > C언어' 카테고리의 다른 글
C오답노트01_출력과 입력 (0) | 2025.03.19 |
---|---|
C언어 문자와 문자열 (1) | 2025.03.02 |
C언어 포인터 (0) | 2025.03.01 |
C언어 배열 (2) | 2025.02.28 |
10_Q&A 함수원형에 대한 물음.zip (0) | 2025.02.16 |