Khi nào bạn nên sử dụng bools trong C ++?


34

Chúng tôi đã có một nhiệm vụ cho lớp học của chúng tôi, nơi chúng tôi phải tạo ra một trò chơi Tic-tac-toe . Mọi người thích phức tạp hóa bản thân, vì vậy họ đã viết các trò chơi phức tạp bao gồm các menu. Vào cuối của trò chơi, bạn phải có tùy chọn để chơi lại hoặc thoát khỏi chương trình. Tôi đã sử dụng một intbiến cho điều đó, nhưng tôi nhận thấy một số bạn cùng lớp sử dụng BOOL.

Có hiệu quả hơn không? Có gì khác nhau, giữa việc lưu trữ một câu trả lời chỉ nên lưu trữ hai giá trị trong một intthay vì lưu trữ nó trong một bool? Mục đích chính xác của các biến này là gì?


32
Không chắc chắn về hiệu quả, nhưng mục đích của an intlà lưu trữ một số nguyên và mục đích của a boollà lưu trữ giá trị boolean ( truehoặc false). Sử dụng boolIMO phản ánh việc sử dụng nó tốt hơn nhiều so với sử dụng int.
George Duckett

12
Trên thực tế, trước C ++ và C99, C89 không có loại Boolean. Các lập trình viên thường sẽ typedef int Boollàm rõ rằng họ đang sử dụng boolean. C ++ tích hợp hỗ trợ cho boolngôn ngữ, cũng như C99 với _Booltừ khóa (khá xấu xí) .
Charles Salvia

Đó không phải là "biết khi nào nên sử dụng bool", đó là lý do tại sao chúng ta có các tên khác nhau cho các loại tương tự (như length_t) và tại sao điều quan trọng là trình biên dịch kiểm tra các loại.
Abyx

Đôi khi câu trả lời chỉ là "hương vị". Tôi cá là nếu bạn viết lại bài tập tương tự của bạn ngay lúc này thì sẽ có một vài thứ khác nhau như thứ tự tham số hàm và tên của chúng. Tại sao bạn không viết nó cùng thứ tự tham số hoặc cùng tên? Đó là bởi vì bạn vừa không hoặc điều đó không quan trọng lắm và bạn chỉ viết bất cứ điều gì

Câu trả lời:


82

Khi chọn loại biến và tên biến bạn muốn ý định của mình càng rõ ràng càng tốt. Nếu bạn chọn loại bool(boolean), rõ ràng chỉ có hai giá trị được chấp nhận: truehoặc false. Nếu bạn sử dụng loại int(số nguyên), không còn rõ ràng rằng mục đích của biến đó chỉ có thể là 1 hoặc 0 hoặc bất kỳ giá trị nào bạn chọn có nghĩa truefalse. Plus sizeof(int)thường sẽ trả về là 4 byte, trong khi sizeof(bool)sẽ trả về 1.


7
Đã đồng ý. Tôi nghĩ ý định thiết kế là quan trọng hơn. Chỉ đôi khi bạn sẽ cần ghi đè chúng.
ChrisF

9
Để phục hồi quan điểm của @ AndrewFinnel: Bool là tài liệu tự nhiều hơn. Một biến bạn đặt thành 0 hoặc 1 có thể là một bộ đếm; một biến bạn đặt thành đúng hoặc sai rõ ràng là một cờ.
Scott C Wilson

2
Bools ngăn chặn lạm dụng một biến cho sử dụng khác. Một số nguyên có thể được đặt thành các giá trị khác 0 hoặc 1 để tạo các trạng thái bổ sung mà mã của bạn có thể không nhận biết được.
Michael Storesin

+1. Nó làm cho ý định / lựa chọn rõ ràng. Bạn có thể sử dụng bất kỳ phương pháp nào bạn muốn để lưu trữ giá trị bao gồm một chuỗi có giá trị "có" hoặc "không", nhưng bạn nên chọn phương thức có ý nghĩa NHẤT. Trong trường hợp này, đó là một boolean.
Craige

Tôi nghĩ booleans trong C ++ có cùng kích thước với ints, 4 byte.
DogDog

53

Dường như trong tất cả các câu trả lời (cho đến bây giờ) không ai bắt gặp thực tế là OP đã nói về BOOLkhông bool.

Vì câu hỏi được gắn thẻ C ++, nên phải lưu ý rằng:

  • intlà một số nguyên nằm trong phạm vi từ INT_MINđến INT_MAX- macro được xác định trong <climits>đó các giá trị phụ thuộc vào kiến ​​trúc của máy chủ lưu trữ. Trong C ++, các giá trị này cũng có thể truy cập được std::numeric_limits<int>::min()...:max()tương ứng). Hành vi của các toán tử boolean được áp dụng để intcoi 0sai và mọi thứ khác là đúng .
  • BOOLchỉ là một gợi ý gợi ý một hành vi boolean cho int. Nó được định nghĩa <cstddef>

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLkhông có gì nhiều hơn cú pháp cú pháp, đối với trình biên dịch - không có gì khác hơn một int. Đó là thứ mà lập trình viên C sử dụng, nhưng lập trình viên C ++ nên tránh, vì C ++ có bool.

  • boollà một loại tích phân ngôn ngữ có giá trị được hỗ trợ là truefalse. Khi chuyển đổi int truethành 1 và falsetrở thành 0.

Khía cạnh quan trọng là nó an toàn hơn trước các lỗi lập trình:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

không thể mã với loại bool thích hợp:

bool a = false;
a = 5; // error: no bool(const int&) available.

Sử dụng BOOLthay vì boolchỉ là một thói quen xấu được thừa hưởng từ quá khứ huy hoàng mà thực tế vẫn không thể quên, do đó tạo ra vấn đề cũ cho một ngày mai ít vinh quang hơn.

Giáo viên ngôn ngữ nên nghiêm túc suy nghĩ về nó!


9
BOOL không phải là một phần của ngôn ngữ C ++ cũng như ngôn ngữ C. BOOL với các chữ cái viết hoa là cách phổ biến nhất mà booleans được thực hiện trong C, trở lại thời xưa khi C không có kiểu boolean. Ví dụ: API Windows sẽ xác định BOOL. Hơn nữa, không có cách nào để xác định BOOL được định nghĩa như thế nào, một số ứng dụng có thể định nghĩa nó là trường bit dài một bit. Bạn không thể cho rằng nó luôn bằng int chỉ vì một số thư viện cụ thể định nghĩa nó theo cách đó.

1
+1. Có lẽ anh ta thực sự đã bình BOOL và không bool. Có lẽ BOOL có thể được triển khai theo những cách có khả năng khác nhau, mặc dù Codereview có thể không biết rằng nếu anh ta hỏi loại câu hỏi này. Anh ta thấy rằng nó được định nghĩa là một int, vì vậy anh ta tự nhiên hỏi tại sao anh ta không thể đơn giản sử dụng int.
Neil

1
@Lundin: nói chung là bạn đúng, nhưng hãy xem đây là câu trả lời nằm trong phạm vi câu hỏi, trong đó OP đã nói về BOOL và tương đương int.
Emilio Garavaglia

Mặc dù vậy, ý tưởng sử dụng BOOL hoặc bool để biểu thị ý định vẫn được áp dụng.
Andrew T Finnell

1
@zvrba: đúng, nhưng điều này là do cách MS quyết định thực hiện bool trong trình biên dịch riêng của mình. Nó chỉ hợp lệ cho các trình biên dịch MS làm việc cho các bộ xử lý Intel. Lưu ý rằng, đối với nền tảng Intel, mọi loại tích phân ngắn hơn 32 bit đều yêu cầu mặt nạ trên đầu vào hoặc đầu ra. Nhưng char [] vẫn được sử dụng và không nhất thiết phải luôn được thay thế bằng int []
Emilio Garavaglia

6

Các loại Bool nhỏ hơn các loại Int, do đó sử dụng ít bộ nhớ hơn. Tùy thuộc vào hệ thống bạn đang biên dịch trên / for, một Int có thể là 4 - 8 byte, trong khi Bool là 1 byte (như có thể thấy trong bài viết MSDN này )

Kết hợp điều này với một số khía cạnh của KISS và thiết kế chương trình tốt, và rõ ràng lý do tại sao nên sử dụng một bool để lưu trữ một biến sẽ chỉ có 2 giá trị.

Tại sao quá phức tạp mọi thứ với một đối tượng có thể lưu trữ một loạt các giá trị, khi bạn chắc chắn rằng bạn chỉ cần lưu trữ 1 trong 2 giá trị khác nhau?

Điều gì xảy ra trong hệ thống sử dụng int, nếu bạn lưu trữ 75 trong đó? Nếu bạn đã thêm điều kiện bổ sung

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

hoặc là

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

sau đó bạn được bảo vệ cho tình huống này. Nhưng nếu bạn không, thì bạn không.

Bạn cũng có thể có một trường hợp (tùy thuộc vào cách bạn thay đổi giá trị của int) nơi bạn có bộ đệm tràn và giá trị "đặt lại" trở về 0 hoặc giới hạn dưới của int của bạn (có thể ở đâu đó trong vùng từ -127 đến ,9,223,372,036,854,775,808, tùy thuộc vào kiến ​​trúc mục tiêu của bạn ) điều gì xảy ra trong mã của bạn sau đó?

Tuy nhiên, nếu bạn đã sử dụng một bool, bạn có thể sử dụng một cái gì đó như thế này:

if(continueBool == true)
  return true;
else
  return false;

Hoặc thậm chí:

return (continueBool== true) ? true : false;

hoặc thậm chí:

return continueBool;

Tùy thuộc vào trình biên dịch của bạn, có thể có các tối ưu hóa mà nó có thể thực hiện trên mã sử dụng Bools để lưu trữ các giá trị đúng / sai được ánh xạ. Trong khi đó, có thể không có tối ưu hóa mà nó có thể thực hiện cho Ints được sử dụng để lưu trữ các giá trị đúng / sai được ánh xạ.

Chúng ta cũng phải nhớ rằng C ++ (cùng với C, hội và FORTRAN) được sử dụng để viết mã hiệu quả cao, nhỏ và nhanh. Vì vậy, sẽ tốt hơn nếu sử dụng Bool trong trường hợp này - đặc biệt nếu bạn đang được đánh dấu về việc sử dụng biến, bộ nhớ, bộ đệm hoặc thời gian xử lý của bạn.

Một câu hỏi tương tự sẽ là: tại sao tôi sẽ lưu trữ một số nguyên (giá trị) trong một float? Trả lời: Bạn không nên, vì không có điểm nào.

Câu chuyện dài: Khi giáo viên / gia sư / giảng viên / giáo sư của bạn vượt qua các kích cỡ của các loại giá trị khác nhau với bạn (trong trường hợp bạn bỏ lỡ nó) và tại sao chúng lại quan trọng trong Phát triển phần mềm.

Tôi hy vọng điều đó sẽ giúp ích như một điểm khởi đầu (tôi cũng hy vọng rằng nó không xuất hiện dưới dạng mô phạm)


4
Sử dụng không cần thiết của giải thưởng if (). Chỉ cần viết return value >= 0;cho ví dụ đầu tiên.
zvrba

Tôi không chắc về mức độ hiểu biết về cú pháp của OP. Đôi khi nó thật bổ ích khi dài dòng hơn một chút so với bình thường - đặc biệt là khi OP đề cập rằng đó là một nhiệm vụ
Jamie Taylor

2
Không đồng ý - nhưng chỉ để chỉ ra rằng việc lưu ba byte bằng cách chọn một bool trên một int sẽ không tạo ra bất kỳ sự khác biệt đáng chú ý nào đối với hầu hết các chương trình. Đừng lo lắng về hiệu quả cho đến khi bạn thực sự có vấn đề về hiệu suất!
James Anderson

@James: cũng trong nhiều trường hợp bạn sẽ không lưu ba byte vì biến tiếp theo, trừ khi đó là một bool hoặc char khác, có thể sẽ được căn chỉnh theo ranh giới bốn byte.
JeremyP

1

Mục đích ở đây là sự rõ ràng của ý định. Kiểu trả về là một phần của giao diện chức năng và boolcho bạn biết nhiều hơn về những gì mong đợi từ chức năng so với intthực tế.

Thậm chí BOOLcòn biểu cảm hơn int, mặc dù nó cùng loại nhưng ít nhất nó cũng thể hiện ý định của bạn.

Tuy nhiên, không ai trong số họ là những gì tôi muốn giới thiệu:

enum class UiCmd {QUIT, START_GAME};

-1

Trong lập trình, bạn muốn đại diện cho một cái gì đó từ cuộc sống thực trong mã. Mặc dù int và bool có thể làm như nhau, ý tưởng phụ hoàn toàn khác nhau: khi sử dụng bool, câu trả lời có thể là có hoặc không; và đó là tất cả, đó là ý định. Với số nguyên, bạn có thể biểu thị số lượng không có dấu thập phân. Và theo tinh thần đó, tại sao bạn lại chọn một số nguyên khi một nhân đôi có thể làm như vậy? Nếu một số nguyên có ý nghĩa nhiều hơn gấp đôi khi mô hình hóa vấn đề, thì bạn có thể chọn một số nguyên.


1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong câu trả lời hàng đầu ở đây đã được đăng khoảng 6 năm trước
gnat

-2

Bởi vì cuối cùng, bạn sẽ chuyển đổi số nguyên của mình thành boolean bằng mọi cách: "if (i = 1) sau đó chơi một trò chơi khác". Trong tình huống này (i = 1) được chuyển đổi thành đúng hoặc sai: một boolean.


phụ thuộc rất nhiều vào máy bạn đang chạy và trình biên dịch có liên quan. Bạn có thể ngạc nhiên khi tìm hiểu hơn trên các máy tính lớn của IBM một cờ ký tự đơn với "Y" hoặc "N" là cách hiệu quả nhất để triển khai logic boolean.
James Anderson

4
Đáng lưu ý, if (i = 1)có lẽ là điều rất sai trong mã của một người.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.