การดำเนินงาน &&& ในค


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;
}

ผลลัพธ์ของโปรแกรมข้างต้นที่คอมไพล์ใช้gccคือ

0
1
1

ด้วย-Wallหรือ-Waddressตัวเลือกgccออกคำเตือน:

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

การcประเมินในโปรแกรมข้างต้นเป็นอย่างไร


42
ฉันเชื่อว่ามันi && (&i)? น่าสนใจที่ฉันไม่พบโพสต์ซ้ำใน SO
เกี่ยวข้อง

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


8
ไม่ใช่คำถามที่ซ้ำกัน แต่เป็นคำถามที่คล้ายกันและเป็นลิงก์ที่ดี
Nathan Cooper

คำตอบ:


272

มันc = i && (&i);มีความเป็นอยู่ที่ซ้ำซ้อนส่วนที่สองเนื่องจากจะไม่ประเมิน&ifalse

สำหรับผู้ใช้กำหนดชนิดที่คุณสามารถเกินจริงเอกoperator &มันอาจจะแตกต่างกัน แต่ก็ยังคงเป็นความคิดที่ดีมาก

หากคุณเปิดคำเตือนคุณจะได้รับสิ่งต่อไปนี้:

คำเตือน: ที่อยู่ของ 'i' จะประเมินเป็น 'จริง' เสมอ


1
ทำไมไม่: c = i & (&&i);; ที่ไหนiฉลากบางคืออะไร?
anishsane

4
@anishsane iถูกกำหนดเป็นintและไม่มีป้ายกำกับในคำถาม นอกจากนี้ยังแทะเล็มสูงสุด ...
Luchian Grigore

5
@anishsane: และ&&โอเปอเรเตอร์ที่จะใช้ที่อยู่ของป้ายกำกับนั้นเป็นส่วนขยาย gcc ที่ไม่ได้มาตรฐาน แต่แม้ว่าจะเป็นมาตรฐานกฎการแทะเล็มสูงสุดจะป้องกันไม่ให้ถูกวิเคราะห์คำด้วยวิธีนั้น (เว้นแต่คุณจะเว้นวรรค)
Keith Thompson

จริงๆแล้ว&iสามารถประเมินfalseได้ บางครั้งมันใช้สำหรับค่าเริ่มต้น ตัวอย่าง: void fn(type& x = *reinterpret_cast<type*>(NULL)); อะไรคือค่า&xในfnถ้าfnเรียกว่าไม่มีพารามิเตอร์? มันคือ 0 เท็จ อย่างไรก็ตามการใช้มันด้วยวิธีการที่อธิบายไว้ก็จะเป็นจริงเสมอเว้นแต่และถ้าใครได้ใช้มันเป็นฉันอธิบายว่ามันจะเป็นi == 0 c = &i && i
เอเดรีย

@LuchianGrigore: เป็นไงบ้าง
เอเดรีย

118

ไม่มี&&&โอเปอเรเตอร์หรือโทเค็นในซี แต่มีตัวดำเนินการ&&(ตรรกะ "และ") และ&(ที่อยู่แบบไม่มีค่าหรือบิต "และ") อยู่

ตามกฎการแทะเล็มสูงสุดสิ่งนี้:

c = i &&& i;

เทียบเท่ากับสิ่งนี้:

c = i && & i;

มันตั้งค่าcเป็น 1 ถ้าทั้งสองiและ&iเป็นจริงและเป็น 0 หากทั้งสองเป็นเท็จ

สำหรับ int ค่าที่ไม่เป็นศูนย์ใด ๆ จะเป็นจริง สำหรับตัวชี้ค่าที่ไม่เป็นโมฆะใด ๆ นั้นเป็นจริง ดังนั้น:

มันตั้งค่าcเป็น 1 ถ้าiไม่ใช่ศูนย์หรือ0ถ้าiเท่ากับศูนย์

ซึ่งหมายความว่า&&&มีการใช้ที่นี่เพียงเพื่อทำให้งงงวยโดยเจตนา การมอบหมายอาจรวมถึงสิ่งใดสิ่งหนึ่งต่อไปนี้:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.