C++언어, 데이터형 변환

gurumong의 이미지

#include <iostream>
#include <ctime>
using namespace std;
int main(void)
{
    cout << "지연 시간을 초 단위로 입력하십시오: ";
    float secs;
    cin >> secs;
    <span>clock_t delay = secs * CLOCKS_PER_SEC; //<-----이부분</span>
 
    cout << "카운트를 시작합니다. \a\n";
    clock_t start = clock();
    while (clock() - start < delay)
        ;
    cout << "종료\a\n";
    return 0;
}

C:\work>g++ waiting.cpp
waiting.cpp: In function `int main()':
<span>waiting.cpp:9: warning: converting to `clock_t' from `float' //<-----이부분</span>
 
C:\work>a
지연 시간을 초 단위로 입력하십시오: 3
카운트를 시작합니다.
종료
 
C:\work>

책의 예제를 실행시켜 보다가 궁금한것이 있어 질문을 드립니다

컴파일중에 경고 메세지가 떴는데요
지연시킬 클럭수를 계산하기 위해 float형의 초단위를 입력 받아서 클럭/초 를 곱하는것인데
이렇게 자동형변환을 하는것이 잘못된 습관인가요?

강제적으로 형변환을 하도록 하니까 경고메세지는 사라졌는데
clock_t delay = clock_t(secs * CLOCKS_PER_SEC);
이렇게 강제적으로 형변환을 하는게 이후에 다른 문제가 생길 여지를 만드는것이 아닌가요?

siabard의 이미지

자동 형변환의 경우 프로그래머가 의도치 않은 오류를 만들 수 있습니다.

명시적으로 형변환으로 하는 경우라면 프로그래머가 변환에 의해 생기는 문제 - 자리수가 잘린다던가하는 등 - 를 인식하고 그에 따른 피해는 감수한다고 볼 수 있습니다.

하지만 자동 형변환으로 변환되는 경우, 데이터의 변환의 결과는 때에 따라 의도치 않은 결과로 나올 수 있습니다. 그에 따른 연장선으로 컴파일러에서 미리 해당 내용을 경고해준다고 보면 적절합니다.

--
새로움을 느끼기에 삶은 즐겁다..
모험가 아돌 크리스틴을 꿈꾸며..
Sia..

새로움을 느끼기에 삶은 즐겁다..
모험가 아돌 크리스틴을 꿈꾸며..
Sia..

netionics의 이미지

형변환을 명시하자는 의견과 나두자는 의견이 있는데

명시적으로 형변환 연산자를 쓰면 프로그래머가 잘못된 형변환을 시도하려고 해도 대개 경고 없이 통과한다는 점,
또 프로그래머가 형변환 결과에 대해서 잘못 예측하고 사용할 수 있다는 점에서 경고를 띄워주는게 더 안전할 것이라는 의견이 있고

반대로 컴파일러마나 내주는 경고나 에러는 천차만별이라 반드시 경고가 뜬다는 보장이 없으며
명시적 형변환은 코드의 어느 위치에서 변환이 일어나는지 쉽게 알 수 있게 해준다는 점
코드가 길어지면 저런 경고가 너무 많이 생겨 프로그래머를 수고스럽게 만든다는 이유 등으로 명시적 형변환을 찬성하는 의견도 있습니다.

:)

anergon의 이미지

clock_t를 다루는 함수로 하는게 좋겠죠. clock_t가 어떻게 정의되어 있는
지 표준문서에 clock_t는 int로 한다든지 하는건 저도 모릅니다.

예를 들어 pthread_t라는 쓰레드 자료형이 있는데 리눅스에서는 unsigned
int 였지만 다른 어떤 환경에서는 구조체여서 애먹은 적이 있습니다.

또 하나 예를 들자면 이런 경우도 있습니다. 소켓에서 recv가 원형은 int를
돌려 주는데 주제넘은 개념으로 받은 바이트를 돌려주니 unsigned int로
받아서 -1을 내뱉는 코딩은 돼 있데 루트를 타지 못하는 경우도 있었습니다.

때때로 unsigned int냐 int냐 가지고도 전체 구조가 뒤 흔들리는 경우도
생깁니다.

아무튼 최소한 이름이 다른 자료형이거나 타입재정의가 되어있다면 clock_t를
float형으로 하는 것은 호환성이나 혹은 오류를 일으킬 가능성이 크고 좋지
않은 습관임에는 분명합니다.

더군다나 C++이라면...특성상 타입 형변환은 더 크게 신경써 주셔야 할
부분입니다.

winner의 이미지

Programmer가 그 위치가 자동으로 가능하지 않은 부분을 인지하고 있습니다.
만일 변환값이 int로 언제나 표현가능하다면 변환이 문제될 것은 없습니다.

문제는 차후 변환값이 int로 표현불가능한 상태가 발생할 때인데 만일 변환을 하지 않고 경고를 남겨둠으로써 그 부분이 bug가 될 수 있음을 항상 인지하는 것이 좋은지에 대해서 생각해 볼 수 있습니다. 이 경우 단점은 다른 compiler 오류와 경고를 float -> int 묵시적 변환 경고로 인해 보기가 껄끄러운 점입니다.
명시적으로 변환을 지정한다면 반대의 장단점을 생각할 수 있는데 만일 bug가 난다면 명시적 변환 지점을 찾아 본다는 것을 염두하고 있어야 할 겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.