2009-09-25 36 views
27

Có phải if (c) giống với if (c == 0) bằng C++ không?Nếu câu lệnh được đánh giá bằng C++ thì sao?

+2

Hãy nhớ rằng 0 không phải lúc nào cũng có nghĩa giống nhau. Nó có thể là hằng số con trỏ null hoặc số nguyên không. –

+3

Bạn không có nghĩa là "Nếu (c) giống như (c! = 0) trong C++?" ? –

+0

Biến c có thuộc loại cụ thể không? –

Trả lời

44

Không, if (c) cũng giống như if (c != 0). Và if (!c) cũng giống như if (c == 0).

+9

Giả sử không có quá tải quá tải nơi, thường là một phần của câu trả lời trong C++. –

+6

ofcourse, nếu các toán tử == hoặc! = Bị quá tải, bất cứ điều gì có thể xảy ra, nó thậm chí có thể bắt đầu chơi quốc ca cho bạn ... ;-) – Jesper

+9

Một trong những ngày này tôi sẽ tạo một lớp mà các toán tử quá tải để chơi hiệu ứng âm thanh. Nó sẽ rất tuyệt vời mỗi khi ai đó muốn sắp xếp chúng. – rlbond

3

Nó giống như if (c != 0)

Tất nhiên, != điều hành có thể bị quá tải vì vậy nó không hoàn toàn chính xác để nói rằng đó là những chính xác bằng.

0

Có chúng giống nhau nếu bạn thay đổi == 0 thành != 0.

+0

Uh, không có. – Aistina

+0

Câu lệnh if là * đã định nghĩa * để chấp nhận bất kỳ điều gì khác không đúng. Vì vậy, có nó là như nhau. –

21

Tôi sẽ ngắt gói khỏi gói này ... "if (c)" gần nhất với "if (((bool)c) == true)". Đối với các loại số nguyên, điều này có nghĩa là "if (c != 0)". Như những người khác đã chỉ ra, quá tải operator != có thể gây ra một số sự kỳ lạ nhưng có thể quá tải "operator bool()" trừ khi tôi bị nhầm lẫn.

+1

Câu hỏi ban đầu được gắn thẻ chỉ với C, do đó các câu trả lời ở trên vì không có bool trong C. –

+3

nếu (static_cast (c)) ... Tôi sẽ lấy áo khoác của mình. –

+0

C99 có Bool ... – rlbond

0

Điều này chỉ đúng đối với các giá trị số. nếu c là lớp phải có một nhà điều hành quá tải mà không boolean chuyển đổi, chẳng hạn như ở đây:

#include <stdio.h> 

class c_type 
{ 
public: 
    operator bool() 
    { 
     return true; 
    } 
}; 

int main() 
{ 
    c_type c; 
    if (c) printf("true"); 
    if (!c) printf ("false"); 
} 
6

Nếu c là một con trỏ hoặc một giá trị số,

if(c) 

tương đương với

if(c != 0) 

Nếu c là một boolean (kiểu bool [chỉ C++]), (chỉnh sửa: hoặc một loại người dùng định nghĩa với sự quá tải của các bool operator())

if(c) 

tương đương với

if(c == true) 

Nếu c là cũng không phải là con trỏ hoặc một giá trị số không phải là một boolean,

if(c) 

sẽ không biên dịch.

+2

Nó c là một loại người dùng định nghĩa chỉ có thể thực hiện 'toán tử bool()' như D. Shawley và galets cả hai chỉ ra và do đó, nó sẽ biên dịch tốt. – Troubadour

+0

Chính xác, tôi thêm nó vào lời giải thích –

-5

Nếu c là một con trỏ sau đó kiểm tra

if (c) 

là không hoàn toàn giống như

if (c != 0) 

Sau đó là một tấm séc đơn giản của c so với 0 (null) con trỏ trong khi cựu thực sự là một hướng dẫn để kiểm tra xem c có trỏ tới một đối tượng hợp lệ hay không. Thông thường trình biên dịch sản xuất cùng một mã mặc dù.

+0

không, nó không phải ... cả hai có nghĩa là hoàn toàn giống nhau trong trường hợp của một con trỏ: if (c! = NULL) – Massa

+0

Không có cách nào để biên dịch và/hoặc thời gian chạy đến biết một đối tượng có hợp lệ trong C hoặc C++ hay không. Bạn có thể viết: "X * c = (X *) 1;" Sau đó, c gần như chắc chắn trỏ đến một đối tượng không hợp lệ. Và "nếu (c)" sẽ là đúng. –

+0

@Andrew: Tôi nghi ngờ bạn có thể biện minh cho tuyên bố của bạn rằng không có cách nào để kiểm tra xem đối tượng có hợp lệ hay không. Chắc chắn nó sẽ đòi hỏi rất nhiều nỗ lực của trình biên dịch để tạo ra mã thời gian chạy để kiểm tra và đó là lý do tại sao các trình biên dịch không bận tâm và tạo ra mã giống như kiểm tra đối với con trỏ null. Đó là lý do tại sao ví dụ của bạn không tạo ra kết quả sai trên (có thể) tất cả các trình biên dịch hiện tại. – Troubadour

Các vấn đề liên quan