Hoạt động &&& trong C là gì


195
#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

Đầu ra của chương trình trên được biên dịch bằng cách sử dụng gcc

0
1
1

Với tùy chọn -Wallhoặc -Waddress, gccđưa ra cảnh báo:

warning: the address of i will always evaluate as true [-Waddress]

Làm thế nào cđược đánh giá trong chương trình trên?


42
Tôi tin i && (&i)không? Thật thú vị khi tôi không thể tìm thấy một bài viết trùng lặp trên SO.
liên quan

42
while (i &&& i <-- j) {}.
kennytm


8
Không phải là một bản sao, nhưng là một câu hỏi tương tự và đó là một liên kết tốt
Nathan Cooper

Câu trả lời:


272

Đó là c = i && (&i);, với phần thứ hai là dư thừa, vì &isẽ không bao giờ đánh giá được false.

Đối với loại do người dùng xác định, trong đó bạn thực sự có thể quá tải unary operator &, nó có thể khác, nhưng đó vẫn là một ý tưởng rất tồi .

Nếu bạn bật cảnh báo , bạn sẽ nhận được một cái gì đó như:

cảnh báo: địa chỉ của 'i' sẽ luôn được đánh giá là 'đúng'


1
Tại sao không : c = i & (&&i);; Trong trường hợp ilà một số nhãn?
anishsane

4
@ biến mất iđược định nghĩa là intvà không có nhãn trong câu hỏi. Ngoài ra, munch tối đa ...
Luchian Grigore

5
@ biến mất: Và &&nhà điều hành để lấy địa chỉ của nhãn là phần mở rộng gcc không chuẩn. Nhưng ngay cả khi nó là tiêu chuẩn, quy tắc munch tối đa sẽ ngăn không cho nó bị phân tích cú pháp theo cách đó (trừ khi bạn chèn một khoảng trắng).
Keith Thompson

Trên thực tế, &icó thể đánh giá để false. Nó được sử dụng đôi khi cho mặc định. Ví dụ: void fn(type& x = *reinterpret_cast<type*>(NULL)); giá trị của là gì &xtrong fnnếu fnđược gọi là không có tham số? Đó là 0 aka sai. Tuy nhiên, sử dụng nó theo cách được mô tả, nó sẽ luôn đúng trừ khi i == 0, và nếu một người sử dụng nó như tôi mô tả, thì nó sẽ như vậy c = &i && i.
Adrian

@LuchianGrigore: làm sao vậy?
Adrian

118

Không có &&&toán tử hoặc mã thông báo trong C. Nhưng các toán tử &&(logic "và") và &(địa chỉ đơn vị của hoặc bitwise "và") tồn tại.

Theo quy tắc munch tối đa , điều này:

c = i &&& i;

tương đương với điều này:

c = i && & i;

Nó đặt cthành 1 nếu cả hai i&iđều đúng và 0 nếu cả hai đều sai.

Đối với một int, bất kỳ giá trị khác không là đúng. Đối với một con trỏ, mọi giá trị khác null đều đúng (và địa chỉ của một đối tượng luôn luôn là null). Vì thế:

Nó đặt cthành 1 nếu ikhác không, hoặc 0nếu ibằng 0.

Điều đó ngụ ý rằng việc &&&đang được sử dụng ở đây chỉ để che giấu có chủ ý. Nhiệm vụ cũng có thể là bất kỳ điều nào sau đây:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
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.