c++ 초보가 질문 드립니다.

interoasis의 이미지

#include <iostream>
#include <cmath>
 
using namespace std;
 
class vector
{
        protected:
                double k;
        public:
                double x;
                double y;
                vector(double a = 0, double b = 0)
                {
                        x = a;
                        y = b;
                }
                double module()
                {
                        cout << "module " << x << " : " << y << endl;
                        return sqrt(x * x + y * y);
                }
 
                void set_length(double a = 1)
                {
                        double length;
                        length = module();
 
                        x = x / length * a;
                        y = y / length * a;
                }
};
 
int main()
{
        vector a(3, 5);
        cout << "-->" << a.module() << endl;
        a.set_length(2);
        cout << "-->" << a.module() << endl;
        a.set_length();
        cout << "-->" << a.module() << endl;
}

위의 예제를 컴파일하고 실행해봤는데요. 실행결과가 이렇게 나오더군요.
module 3 : 5
-->5.83095
module 3 : 5
module 1.02899 : 1.71499
-->2
module 1.02899 : 1.71499
module 0.514496 : 0.857493
-->1

제 생각에는 소스대로라면 --> 먼저 나오고 그 다음 module 3 : 5라는 출력이 나와야 할것 같은데 왜 -->가 나중에 나오는걸까요? 아무리 생각해도 풀리지않아 여쭤봅니다.

그리고 c++책을 사려고하는데요. C언어를 배웠다는 가정하에 읽을만한 책이 뭐가있을까요? 이곳에서 검색해보니 저한테 맞는건 C++ Primer라는 책같던데,, 글 쓰인 시기가 좀 오래된것들뿐이라서요. 요즘에 나온것들중에 괜찮은 C++책 있을까요? 인터넷에 잘 정리된곳에서 공부를 하고있긴하지만 c++을 이해하기엔 뭔가 좀 부족하다는 느낌이 드네요. 효율적인 예제와 코드설명이 잘 돼있어서 이해에 도움이 되는 책이었음 좋겠습니다. 연습문제 많으면 더 좋구요. 원서였으면 좋겠네요.

그럼 답변 부탁드리겠습니다.

ifree의 이미지

a.module() 이 오퍼레이터 << 의 인수로 먼저 evaluate 되면서 side effect 로 문자열이 출력됩니다.

C++ 의 syntax 에 관한 책은 나올건 다 나왔다고 생각되는데, 옛날 책들이 더 좋은 것 같은데요.

Thinking in C++ 먼저 보고, 이른바 Expert's guide라고 하는 The C++ Programming Language 정도 마스터하면 충분할 듯.

interoasis의 이미지

답변 감사드립니다.
그럼 어떠한 경우에, 어떤 우선순위로 인수가 << 에 평가되는건가요? 다른 비슷한 예문들을보면 그냥 순서대로, 생각한데로 잘 출력이 되던데요.. side effect라함은 정상적이지 못한 작동이라는건가요?

jick의 이미지

side effect는 우리말로 하면 "부작용"이 되어서-_- 정상적이지 못하다는 느낌을 줄 수 있는데, 그런 의미가 아니라 그냥 함수를 실행하면 그 함수가 인자를 바꾸고 결과값을 돌려주는 것 외에 global state를 바꾸는 아무 일이나 하면 (로그를 찍는다든지...) 다 side effect라고 부릅니다.

그리고 "다른 비슷한 예문들을 보면 그냥 순서대로, 생각한 대로 잘 출력이" 되는 건

순전히 우연입니다.

절!대!로! 그런 걸 가정하고 프로그램을 짜시면 안됩니다.

C(++)에서 a+b 혹은 a<<b 같은 코드를 만났을 때 a와 b 중 무엇부터 연산하느냐는 전적으로 컴파일러 맘대로입니다. 괄호를 아무리 많이 쳐도 소용없습니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.