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

Đề tài: thắc mắc về phép toán + 1 giá trị với kiểu dữ liệu! @@

  1. #1
    Ngày gia nhập
    03 2011
    Bài viết
    22

    Wink thắc mắc về phép toán + 1 giá trị với kiểu dữ liệu! @@

    mình có đoạn code dạng như sau:
    Code:
    #define a   0
    #define b   sizeof(unsigned int)
    #define c   (a + b)
    #define d   sizeof(unsigned char)
    #define e   (c + d)
    #define f    sizeof(unsigned short)
    #define g   (e + f)
    cứ như thế này vài đợt nữa
    cho mình hỏi sau phép toán trên thì c, e, g có giá trị như thế nào?
    Đã được chỉnh sửa lần cuối bởi grandthorn : 10-08-2011 lúc 03:59 PM.

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    #define là macro, nó hoạt động trên nguyên tắc thay thế text thuần túy.
    Nó chạy ở công đoạn pre-processing, trước công đoạn dịch (compiling).
    Đơn giản là cứ gặp token "g" thì nó thay bằng "(e + f)"
    rồi lại thay tiếp e, f, ... cứ thế cứ thế

    Vì vậy c, e, g không có "giá trị" nào cả! preprocessor cứ gặp cái nào thì thay thế bằng định nghĩa tương ứng của nó, vậy thôi.

  3. #3
    Ngày gia nhập
    03 2011
    Bài viết
    22

    tks bạn nhiều, hiểu được thằng này 1 chút. ko có nút thanks nhỉ?
    mà nó thay nhiều thế thì đoạn ctrình của mình chắc hơi bị nhức đầu, quá trời line mà thay nhảy tùm lum thế chắc chết!

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Trích dẫn Nguyên bản được gửi bởi grandthorn Xem bài viết
    tks bạn nhiều, hiểu được thằng này 1 chút. ko có nút thanks nhỉ?
    mà nó thay nhiều thế thì đoạn ctrình của mình chắc hơi bị nhức đầu, quá trời line mà thay nhảy tùm lum thế chắc chết!
    nó chỉ thay lúc dịch thôi, vì thế code nhìn vẫn sáng nhưng khi dịch ra thì file sẽ lớn ( trường hợp bạn định nghĩa 1 hàm là macro)

  5. #5
    Ngày gia nhập
    01 2011
    Bài viết
    116

    Nếu mình nhớ ko nhầm thì nếu dùng cái này để định nghĩa một hàm đơn giản ví dụ như min, max,.. thì chương trình sẽ chạy nhanh hơn phải ko bạn.
    Nhưng theo ví dụ của chủ tut, thì nếu tất cả a đều thay bằng c+d chẳng hạn, thì chương trình nó sẽ lại phải tính lại c+d à? thế thì ngoài việc phình to file dịch thì chương trình liệu có nhanh hơn ko??
    C++ Code:
    1. while ( you_live) {
    2. if (you_failed) try_again();
    3. else if ( you_won) find_new_challenge();
    4. }
    5. system("DEATH");
    6. return HELL;

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định thắc mắc về phép toán + 1 giá trị với kiểu dữ liệu! @@

    Trích dẫn Nguyên bản được gửi bởi dragonbk91 Xem bài viết
    Nếu mình nhớ ko nhầm thì nếu dùng cái này để định nghĩa một hàm đơn giản ví dụ như min, max,.. thì chương trình sẽ chạy nhanh hơn phải ko bạn.
    Nhưng theo ví dụ của chủ tut, thì nếu tất cả a đều thay bằng c+d chẳng hạn, thì chương trình nó sẽ lại phải tính lại c+d à? thế thì ngoài việc phình to file dịch thì chương trình liệu có nhanh hơn ko??
    Không hẳn đúng.

    ví dụ
    #define max(a, b) ((a) > (b) ? (a) : (b))
    Chú ý là các dấu ngoặc là cần thiết. Khi dùng macro thay function bao giờ cũng để tất cả các param và toàn bộ kết quả trong ngoặc đơn ()
    Bây giờ khi bạn gọi max(f1(x), f2(x)) thì do macro hoạt động bằng thay thế text , nên f1(x) hoặc f2(x) sẽ bị gọi 2 lần (tùy kết quả so sánh) ==> gây chậm hơn so với dùng hàm.
    Dù trong trường hợp đơn giản như gọi max(x, 0) thì dùng macro cũng chỉ nhanh hơn khi compile ở debug mode (không có optimization thôi). Ở release mode, code được inline và tối ưu hóa nên macro không có lợi thế tốc độ gì.

    Nói chung là nên hạn chế dùng macro. Vì macro là khái niệm của tiền xử lý (pre-processor) và không liên quan gì đến phần biên dịch, nên nó ẩn chứa rất nhiều nguy cơ. Có thể coi nó không phải là 1 thành phần của ngôn ngữ C/C++.
    Nhiều trường hợp việc sử dụng macro là thực sự cần thiết. Macro có thể giúp tránh code duplication, và có nhiều vấn đề mà chỉ macro mới giải quyết được Nhưng khi bạn chưa hiểu rõ về nó thì nên hạn chế sử dụng nó. Dễ gây lỗi và gây ra khó khăn trong việc test, debug.

    Ví dụ 1 macro đơn giản và có ích:
    #define PRINT(x) std::cout << #x " = " << (x) << std::endl;
    PRINT(a[0]);
    Đã được chỉnh sửa lần cuối bởi fbchicken : 11-08-2011 lúc 04:56 PM.

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