2010-02-23 25 views
11

Tôi đã và đang sử dụng! (phủ định hợp lý) trong C và bằng các ngôn ngữ khác, tôi tò mò không ai biết làm thế nào để làm của riêng bạn! chức năng? hoặc có một cách sáng tạo để làm một?Tính năng phủ định hợp lý hoạt động như thế nào trong C?

+2

Khi bạn nói về một phương pháp "!", Có vẻ như bạn đang nói về C++. Bạn có thể viết một hàm phủ nhận hợp lý trong C, nhưng bạn không thể ghi đè lên! nhà điều hành. C++ cho phép bạn viết một toán tử! - hoặc là một phương pháp hoặc một chức năng không phải thành viên - nhưng đó là C++, không phải C. – Steve314

+0

Nó không dễ dàng như tôi đã nghĩ để tìm một phần hỏi đáp với tiêu chuẩn nói rằng '!' trả về 1 nếu đầu vào là 0 (trái ngược với bất kỳ giá trị khác khác không trong một thời gian phụ thuộc vào trình biên dịch), nhưng nó là [C99 tiêu chuẩn 6.5.3.3] (http://stackoverflow.com/questions/7945950/is-logical-negation-of- zero-0-compiler-dependent-in-c). Chỉ là FYI. – HostileFork

Trả lời

21
int my_negate(int x) 
{ 
    return x == 0 ? 1 : 0; 
} 
+1

đó là tốt hơn :) –

+1

Không thể tin rằng tôi quản lý để mess rằng lên :-p –

+0

Xảy ra tất cả thời gian với tôi. Tôi sẽ viết một cái gì đó, nhưng thực sự có nghĩa là đối diện chính xác. –

6

!e có thể được thay thế bằng ((e)?0:1)

1

Nếu bạn muốn quá tải một nhà điều hành, các nguyên mẫu thích hợp là:

bool operator!(); 

Tôi không phải là một fan hâm mộ lớn của quá tải khai thác, nhưng một số những người như đường cú pháp của họ. EDIT: Đây là C++ chỉ! Đặt nó trong định nghĩa của lớp học của bạn.

+0

Các toán tử tải trọng hoạt động tốt với các mẫu. Chỉ cần đảm bảo 'toán tử!()' Của bạn có cùng nghĩa ngữ như '!'. –

+0

Nếu bạn đặt nó trong định nghĩa lớp, nó không có đối số và hoạt động trên * điều này. toán tử bool!() const; Nguyên mẫu bạn hiển thị có thể được sử dụng cho định nghĩa toán tử của một người bạn. –

+0

Phải. Trường hợp sử dụng tốt để quá tải một toán tử. Tuy nhiên, nếu bạn không có lý do chính đáng như vậy, toán tử thường không trực quan như một hàm được đặt tên tốt. Luôn có ngoại lệ. – thebretness

5

Hãy nhớ toán tử bang '!' hoặc dấu chấm than trong ngôn ngữ tiếng Anh, được xây dựng thành ngôn ngữ lập trình như một phương tiện để phủ nhận.

Cân nhắc ternary nhà điều hành ví dụ này:

 
(some condition) ? true : false; 

Bây giờ, nếu đã được phủ nhận, các nhà điều hành ternary sẽ này

 
(some condition) ? false : true; 

Khu vực chung, nơi mà có thể nhận được một số lập trình viên trong một chút phù hợp là hàm strcmp, trả về 0 cho các chuỗi giống nhau và 1 cho hai chuỗi không giống nhau:

 
if (strcmp(foo, "foo")){ 

} 

Khi thực sự cần:

 
if (!strcmp(foo, "foo")){ 
} 

Nói chung khi bạn phủ nhận, đó là điều ngược lại như thể hiện trong ví dụ điều hành ternary ...

Hope this helps.

+0

'strcmp' trả về 0 cho các chuỗi giống nhau; nó trả về một số âm (không nhất thiết -1) nếu chuỗi đầu tiên đứng trước thứ hai, và một số dương (không nhất thiết phải +1) nếu chuỗi đầu tiên sau thứ hai - nơi thứ tự dựa trên các giá trị byte của (unsigned) ký tự tạo chuỗi. –

+0

@ Jonathan: Đúng, -1 được coi là đúng ..... vì nó là int không dấu tối đa ... tức là. 0xFFFF ... tức là. khác 0, bất kể khi nào hoặc 'ive – t0mm13b

+0

Câu trả lời của bạn nói' hàm strcmp, trả về 0 cho các chuỗi giống nhau, và 1 cho hai chuỗi không giống nhau '. Điều này là không chính xác; nó trả về một giá trị khác không cho hai chuỗi không giống nhau, không phải 'vô điều kiện 1 nếu các chuỗi khác nhau'. –

3

C xem xét tất cả các giá trị khác 0 "true" và zero "false". Phủ định hợp lý được thực hiện bằng cách kiểm tra với số không. Nếu đầu vào chính xác là 0, xuất ra một giá trị khác 0; nếu không, đầu ra bằng không. Trong mã, bạn có thể viết này là (input == 0) ? 1 : 0 (hoặc bạn có thể chuyển đổi nó thành một tuyên bố if).

Khi bạn hỏi cách "tạo phương pháp riêng của mình!", Ý bạn là bạn muốn viết một hàm phủ nhận giá trị logic hoặc bạn có muốn xác định toán tử dấu chấm than không? Nếu trước đây, sau đó tuyên bố tôi đăng ở trên là đủ. Nếu sau này, sau đó tôi sợ đây là một cái gì đó mà không thể được thực hiện trong C. C + + hỗ trợ quá tải nhà điều hành, và nếu làm điều này là một sự cần thiết nghiêm ngặt thì tôi sẽ đề nghị tìm kiếm ở đó.

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