Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 32 kết quả

Đề tài: Sự khác nhau giữa #define và const như thế nào?

  1. #1
    Ngày gia nhập
    03 2012
    Nơi ở
    Voz forum
    Bài viết
    28

    Mặc định Sự khác nhau giữa #define và const như thế nào?

    các bạn cho mình hỏi sự khác nhau giữa #define và const là gì mà code này khác nhau nhé...tìm mãi không biết lời giải đáp.cảm ơn các bạn rất nhiều...hi vọng lần này post bài không bị banned..hic
    1.cái này báo lỗi:[Error] C:\Users\mong\Documents\C-Free\Temp\Untitled9.cpp:8: error: use of `max' is ambiguous
    Code:
    #include<iostream>
    using namespace std;
    const int max = 100;//cái này và cái #define bên dưới ạ
    class stack
    {
    private:
    int top;
    int nodes[max];
    public:
    stack() // khoi tao stack
    {
    this-> top = -1; // gan top = -1
    }
    bool empty()// Kiem tra xem stack co rong hay khong
    {
    if(top == -1)
    return true;
    else
    return false;
    }
    void push(int data)//day 1 thang vao stack
    {
    if(top == max-1)
    cout<<"Stack bi day"; // truong hop stack bi day
    else
    nodes[++top] = data;//tuong duong top++;nodes[top]=data;
    }
    int pop()//lay ra 1 nut
    {
    if(empty()) //truong hop stack bi rong
    cout<<"Stack bi rong ";
    else
    return nodes[top--];//tra ra gia tri dau stack,giam so nut di 1
    }
    int stacktop()//xem phan tu dau stack
    {
    if(empty())
    cout<<"Stack bi rong ";
    //su ly truong hop stack bi rong
    else
    return(nodes[top]);
    }
    };//cai nay la chung
    //phan main() rieng nhe...
    
    int main(){
    int n;
    stack num;
    int item;
    cout<<"can nhap bao nhieu so?";
    cin>>n;
    for(int i=0;i<n;++i){
    cin>>item;
    num.push(item);
    }
    while(!num.empty()){
    cout<<num.pop()<<" ";
    }
    return 0;
    }]
    2.còn cái này thì chạy ok:
    Code:
    #include<iostream>
    using namespace std;
    #define max 100  //       cái này ạ
    class stack
    {
    private:
    int top;
    int nodes[max];
    public:
    stack() // khoi tao stack
    {
    this-> top = -1; // gan top = -1
    }
    bool empty()// Kiem tra xem stack co rong hay khong
    {
    if(top == -1)
    return true;
    else
    return false;
    }
    void push(int data)//day 1 thang vao stack
    {
    if(top == max-1)
    cout<<"Stack bi day"; // truong hop stack bi day
    else
    nodes[++top] = data;//tuong duong top++;nodes[top]=data;
    }
    int pop()//lay ra 1 nut
    {
    if(empty()) //truong hop stack bi rong
    cout<<"Stack bi rong ";
    else
    return nodes[top--];//tra ra gia tri dau stack,giam so nut di 1
    }
    int stacktop()//xem phan tu dau stack
    {
    if(empty())
    cout<<"Stack bi rong ";
    //su ly truong hop stack bi rong
    else
    return(nodes[top]);
    }
    };//cai nay la chung
    //phan main() rieng nhe...
    
    int main(){
    int n;
    stack num;
    int item;
    cout<<"can nhap bao nhieu so?";
    cin>>n;
    for(int i=0;i<n;++i){
    cin>>item;
    num.push(item);
    }
    while(!num.empty()){
    cout<<num.pop()<<" ";
    }
    return 0;
    }
    các bạn giúp mình nhé...

  2. #2
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    1.cái này báo lỗi:[Error] C:\Users\mong\Documents\C-Free\Temp\Untitled9.cpp:8: error: use of `max' is ambiguous
    Trong namespace std đã có hàm max, thuộc thư viện cmath. Bạn khai báo một biến cùng tên với hàm đã được định nghĩa thì rõ ràng là gây ra sự trùng lặp, thiếu đi tính tường minh của biến.
    2. Define tức là bạn sử dụng macro, hoạt động như hàm inline. Tên hàm có thể trùng nhau nên trường hợp sau của bạn không bị lỗi.

    Tốt nhất đừng tự làm khổ mình với những vấn đề như thế này. Có đến 26 kí tự latinh, có thêm các kí tự _, và 10 chữ số từ 0-9 để bạn thay đặt tên cho biến của bạn. Tại sao không gọi nó là _max, hoặc myMax, hoặc ... mà cứ phải là max cho trùng với tên hàm của ng ta đã định nghĩa!
    Mời các bạn ghé thăm blog cá nhân của tôi

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Trích dẫn Nguyên bản được gửi bởi rataki Xem bài viết
    cảm ơn bạn nhé.có thể nói cho mình biết sự khác nhau của #define và const không?
    #define : Trình biên dịch thay giá trị define vào vị trí nó gặp.
    const : một biến không đổi
    What you see is never what you get...

  4. #4
    Ngày gia nhập
    03 2012
    Nơi ở
    Voz forum
    Bài viết
    28

    Trích dẫn Nguyên bản được gửi bởi Tab Xem bài viết
    #define : Trình biên dịch thay giá trị define vào vị trí nó gặp.
    const : một biến không đổi
    cảm ơn bạn mình đã hiểu...thank so much

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi Tab Xem bài viết
    #define : Trình biên dịch thay giá trị define vào vị trí nó gặp.
    const : một biến không đổi
    Nguyên tắc là thế, nhưng thực sự thì trình dịch có thể thay hẳn giá trị của biến const vào các biểu thức giống như #define vậy. Thử disassembly là biết.

    TB: Nhân topic này thì mình cũng đã có thêm một ví dụ về tác hại của câu lệnh "using namespace std;" mà rất nhiều người/sách sử dụng một cách vô thức. C++ nó đưa ra cái khái niệm namespace để tránh việc trùng tên (như trường hợp này): mỗi bộ thư viện có một bộ phận độc lập phát triển với nhau, nhóm này không thể biết hết được nhóm kia dùng những tên nào. Ngay cả thư viện chuẩn std của C++ cũng chả mấy ai biết được hết toàn bộ hàm/biến của nó. Vậy mà chỉ vì lười gõ "std::" mà nhiều người bỏ đi một cái tính năng rất hay này.

  6. #6
    Ngày gia nhập
    05 2012
    Nơi ở
    >>..Địa Ngục..<<
    Bài viết
    3

    Mặc định Sự khác nhau giữa #define và const như thế nào?

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Nguyên tắc là thế, nhưng thực sự thì trình dịch có thể thay hẳn giá trị của biến const vào các biểu thức giống như #define vậy. Thử disassembly là biết.

    TB: Nhân topic này thì mình cũng đã có thêm một ví dụ về tác hại của câu lệnh "using namespace std;" mà rất nhiều người/sách sử dụng một cách vô thức. C++ nó đưa ra cái khái niệm namespace để tránh việc trùng tên (như trường hợp này): mỗi bộ thư viện có một bộ phận độc lập phát triển với nhau, nhóm này không thể biết hết được nhóm kia dùng những tên nào. Ngay cả thư viện chuẩn std của C++ cũng chả mấy ai biết được hết toàn bộ hàm/biến của nó. Vậy mà chỉ vì lười gõ "std::" mà nhiều người bỏ đi một cái tính năng rất hay này.
    Anh có thể nói rõ hơn được không, em đang tìm hiểu. Vì có chút thắc mắc ở C++. Khi khai báo thư viện IOSTREAM thì các trình biên dịch đều báo lỗi (riêng DevCpp thì chỉ nhắc nhở nhưng vẫn chạy bình thường). Tìm trên mạng thì toàn kêu thêm "using namespace std;" vào nhưng không biết để làm gì. Giải thích giúp với.

  7. #7
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Define là tiền xử lý.Còn const là biến hằng.Nếu ở mức độ đơn giản thì nó chỉ khác nhau lúc biên dịch.Còn lúc build ra file rồi thì giá trị này đều nằm ở .rdata khi biên dịch ra file PE (only read - phần dữ liệu không đổi,tức là không write vào vùng này được)
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  8. #8
    Ngày gia nhập
    03 2012
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Nguyên tắc là thế, nhưng thực sự thì trình dịch có thể thay hẳn giá trị của biến const vào các biểu thức giống như #define vậy. Thử disassembly là biết.

    TB: Nhân topic này thì mình cũng đã có thêm một ví dụ về tác hại của câu lệnh "using namespace std;" mà rất nhiều người/sách sử dụng một cách vô thức. C++ nó đưa ra cái khái niệm namespace để tránh việc trùng tên (như trường hợp này): mỗi bộ thư viện có một bộ phận độc lập phát triển với nhau, nhóm này không thể biết hết được nhóm kia dùng những tên nào. Ngay cả thư viện chuẩn std của C++ cũng chả mấy ai biết được hết toàn bộ hàm/biến của nó. Vậy mà chỉ vì lười gõ "std::" mà nhiều người bỏ đi một cái tính năng rất hay này.
    Nói rõ hơn giúp em với bác ơi

  9. #9
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi vinhloiz Xem bài viết
    Anh có thể nói rõ hơn được không, em đang tìm hiểu. Vì có chút thắc mắc ở C++. Khi khai báo thư viện IOSTREAM thì các trình biên dịch đều báo lỗi (riêng DevCpp thì chỉ nhắc nhở nhưng vẫn chạy bình thường). Tìm trên mạng thì toàn kêu thêm "using namespace std;" vào nhưng không biết để làm gì. Giải thích giúp với.
    Nói chung bạn vào đây đọc là hiểu: Có nên sử dụng "using namespace std" hay không?

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    @lttq: Bạn nói sai rồi đấy! Giả sử Kevin có define như sau:
    C Code:
    1. #define CVIETMAIN main
    2. int CVIETMAIN ()
    3. {
    4.     //Do something here
    5.     return 0;
    6. }

    Thì sẽ như thế nào?

    Quay trở lại vấn đề:
    #define là pre-processor nghĩa là nó chỉ là một định nghĩa, #define sẽ được xử lý trước khi tiến hành biên dịch! Nói dễ hiểu là #define dùng để định nghĩa A là B. Nói khó hiểu là #define sẽ thay thế tương ứng trước khi tiến hành biên dịch thành chương trình!

    const dùng để khai báo một hằng cho một kiểu dữ liệu nào đó mà sẽ không thể thay đổi giá trị. Kevin nhớ không nhầm thì khi biên dịch một biến kiểu const sẽ được định nghĩa trong .bss section, các biến trong section này được định nghĩa trước nên nó sẽ không thể thay đổi! (thay đổi nó sẽ bị đè nên thằng khác)

    --------------------------------------------------------------
    Các cao thủ học 1 vài ngày ngày lên thần cho Kevin hỏi điều sau:

    Nếu khai báo là const int* a thì cái gì sẽ không thể thay đổi?
    Nếu khai báo là int* const a thì cái gì sẽ không thể thay đổi?
    Nếu khai báo là int const * const a thì cái gì sẽ không thể thay đổi?
    Nếu khai báo là int * const * const a thì cái gì sẽ không thể thay đổi?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Lập trình C++0x const: ý nghĩa của const trong khai báo function
    Gửi bởi quano1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 06-08-2013, 07:24 AM
  2. sự khác nhau giữa: const char * và char const *
    Gửi bởi trihn_kt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 18-03-2012, 08:29 AM
  3. lỗi cannot convert `const char*' to `const WCHAR*' for argument khi dùng autoit với c++
    Gửi bởi morongtraitim88 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-06-2011, 08:54 PM
  4. const A* const method(const A* const) const;//const thứ 2
    Gửi bởi david8xvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 18
    Bài viết cuối: 23-09-2010, 12:36 AM
  5. Lập trình C++ Sự khác nhau giữa int* const và const int* p
    Gửi bởi pdtg50 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 19-08-2010, 06:41 AM

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