Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Thay đổi biến const, lúc được lúc không được?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    609

    Mặc định Thay đổi biến const, lúc được lúc không được?

    Mình có code sau
    C++ Code:
    1. #include <iostream>
    2. void change(const int & x)
    3. {
    4.     int *y = (int*)&x;
    5.     *y = 17;
    6.     std::cout << &x << ", " << x << " #\n";
    7.     std::cout << y << ", " << *y << "\n";
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11.     const int n = 5;
    12.     int *m = (int*) &n;
    13.     *m = 7;
    14.     std::cout << &n << " " << n << " #\n";
    15.     std::cout<< m << " " << *m << "\n";
    16.     int x = 13;
    17.     std::cout << x << "\n";
    18.     change(x);
    19.     std::cout << x << "\n";
    20. }
    21. /*kết quả là
    22. 0x7fd24dffcc 5 #
    23. 0x7fd24dffcc 7
    24. 13
    25. 0x7fd24dffbc, 17 #
    26. 0x7fd24dffbc, 17
    27. 17
    28.  
    29. [Program finished]
    30. */
    Thay đổi biến const x thì được, thay đổi biến const n lại không được
    Có ai có thể giải thích tại sao không?
    Mình dùng tbd cxxdroid

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Bởi vì n được định nghĩa const, bộ biên dịch có thể tạo và dùng bản sao của n. Bộ biên dịch không thể làm thế với x, bởi vì x chỉ được khai báo (chứ không được định nghĩa) const.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    609

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Bởi vì n được định nghĩa const, bộ biên dịch có thể tạo và dùng bản sao của n. Bộ biên dịch không thể làm thế với x, bởi vì x chỉ được khai báo (chứ không được định nghĩa) const.
    Mình hơi hơi hiểu rồi
    Mình sửa dòng 16, trong main, thành "const int x = 13;" thì không thay đổi x được
    C++ Code:
    1. #include <iostream>
    2. void change(const int & x)
    3. {
    4.     int *y = (int*)&x;
    5.     *y = 11;
    6.     std::cout << &x << ", " << x << " #\n";
    7.     std::cout << y << ", " << *y << "\n";
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11.     const int n = 5;
    12.     int *m = (int*) &n;
    13.     *m = 7;
    14.     std::cout << &n << " " << n << " #\n";
    15.     std::cout<< m << " " << *m << "\n";
    16.     const int x = 13;
    17.     std::cout << &x << "$ " << x << "\n";
    18.     change(x);
    19.     std::cout << &x << "$ " << x << "\n";
    20. }
    21. /*kết quả là
    22. 0x7fcfa3520c 5 #
    23. 0x7fcfa3520c 7
    24. 0x7fcfa351fc$ 13
    25. 0x7fcfa351fc, 11 #
    26. 0x7fcfa351fc, 11
    27. 0x7fcfa351fc$ 13
    28.  
    29. [Program finished]
    Cảm ơn bạn.
    Cùng một địa chỉ mà có giá trị khác nhau thì hơi khó hiểu nhỉ.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Ở mỗi thời điểm, mỗi biến chỉ có 1 giá trị. Vấn đề là giá trị được đọc ở thời điểm nào. Đôi khi nó không như ta tưởng.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn