ckrmsckrms19   5년 전

현재 백준 강의를 들으며 문제를 풀어가고 있습니다. 가끔식 예제 풀이 코드를 보면 'LL'과 같은 suffix를 사용하신 것을 보게 됩니다. 

아마도 Compiler가 type conversion warning 하는 것을 피하시려고 하는 것 같은데... 이게 아니라면 왜 쓰신 걸까요? 그리고 만약 그런 의도시라면 보통 그런 warning은 무시하고 말지 않나요? 

밑에는 LL suffix를 사용하신 한 코드입니다. 

djm03178   5년 전

의도가 명확한 것은 좋습니다. 이 값은 long long 값이다, 라는 걸 명확하게 드러내는 게 나쁠 건 없죠.

그리고 워닝이란 건 없을수록 좋습니다. 컴파일러가 워닝을 띄우는 건 그게 좋지 않을 수 있으니까 워닝을 띄우는 겁니다. 설령 그 워닝이 프로그램의 동작에 영향을 미치지 않는다는 것을 알더라도, 그 워닝이 뜨지 않게끔 처리해줘야 다른 워닝들이 뜨더라도 섞이지 않고 쉽게 찾을 수 있습니다.

ckrmsckrms19   5년 전

이런 것도 버릇을 들여놓는 게 좋겠군요. 감사합니다!

상수의 타입을 명확히 표시해야만 문제가 발생하지 않는 경우도 있습니다. 예를 들어, 2^20 같은 값이 필요하다면 보통 아래와 같은 비트 연산을 사용합니다.

1 << 20

하지만 만약 n의 범위가 32비트 정수형에 담을 수 없는 크기의 경우(2^40 이라든가), 위와 같은 방식으로 1 << 40으로 적으면 오버플로우가 발생합니다. 1도 40도 int형이기 때문에 결과도 int형으로 인식하기 때문입니다.  즉,

long long k = 1 << 40;

이 코드는 k가 64비트 정수형이라 하더라도 오버플로우로 인해 이상한 값이 들어가게 됩니다. 이걸 피하려면 아래와 같이 상수에 타입을 명시해주어야 합니다.

long long k = 1ll << 40;

상수에도 타입이 있고, 그 타입으로 인해 연산의 결과가 전혀 달라질 수 있기 때문에 정확히 자신이 필요한 상수의 타입에 맞춰서 명시를 해주는 것이 좋습니다. djm님 말씀처럼 컴파일러의 경고는 말 그대로 이 코드는 위험할 수 있다는 경고기 때문에, 경고가 발생하지 않게 코드를 짜는 버릇을 들이는게 도움이 됩니다.

baekjoon   5년 전

Warning이 하나라도 뜨는게 싫은 이유도 있고, long long이니까 LL을 붙이는 이유도 있습니다.

예전에는 ll을 붙였는데, 1이랑 l이랑 비슷해서, LL을 사용합니다.

댓글을 작성하려면 로그인해야 합니다.