ตัวใดจะดำเนินการเร็วกว่าถ้า (แฟล็ก == 0) หรือ if (แฟล็ก 0 ==)


111

คำถามสัมภาษณ์: อันไหนจะดำเนินการเร็วกว่าif (flag==0)หรือif (0==flag)? ทำไม?


330
ได้รับการเสนอชื่อเข้าชิงคำถามสัมภาษณ์ที่โง่ที่สุดเท่าที่เคยมีมา และมีการแข่งขันที่รุนแรง
Konrad Rudolph

119
คุณ: ตั้งชื่อสถานการณ์ที่ความแตกต่างระหว่างสองสิ่งนี้อาจคุ้มค่ากับการรบกวน ผู้สัมภาษณ์: โอเคคุณได้รับการว่าจ้าง
Chris Lutz

37
ข้อแตกต่างเพียงอย่างเดียวระหว่างทั้งสองคือด้วยการประชุมในภายหลังคุณได้รับการประกันจากข้อบกพร่องเช่นif(flag = 0)ในราคาที่อ่านได้เล็กน้อย
Amarghosh

22
@Amarghosh: เสียค่าใช้จ่ายในการทำให้รหัสของคุณอ่านยากและไม่เข้าใจง่าย ใช้คำเตือนก่อนหน้านี้ในการเปิดคำเตือนของคอมไพเลอร์ของคุณ win-win
GManNickG

129
เมื่อนักเขียนคอมไพเลอร์ได้รับสิ่งนี้ในการสัมภาษณ์ของเขา เขากระซิบตอบ " เจ้าไหนอยากเร็วกว่านี้"

คำตอบ:


236

ฉันยังไม่เห็นคำตอบที่ถูกต้อง (และมีข้อแม้อยู่แล้ว) : นาวาซชี้ให้เห็นกับดักที่ผู้ใช้กำหนดเอง และฉันเสียใจที่รีบโหวต "คำถามที่โง่ที่สุด" เพราะดูเหมือนว่ามีหลายคนทำไม่ถูกและทำให้มีพื้นที่สำหรับการอภิปรายที่ดีเกี่ยวกับการเพิ่มประสิทธิภาพคอมไพเลอร์ :)

คำตอบคือ:

คืออะไรflagชนิด 's?

ในกรณีที่flagเป็นประเภทที่ผู้ใช้กำหนดเอง จากนั้นขึ้นอยู่กับว่าเลือกโอเวอร์โหลดoperator==ใด แน่นอนว่ามันอาจดูโง่ที่มันจะไม่สมมาตร แต่มันก็อนุญาตอย่างแน่นอนและฉันก็เคยเห็นการละเมิดอื่น ๆ มาแล้ว

หากflagเป็นแบบบิวท์อินทั้งคู่ควรใช้ความเร็วเท่ากัน

จากบทความวิกิพีเดียในx86, ฉันเดิมพันสำหรับJxxการเรียนการสอนสำหรับifคำสั่ง: บางทีอาจจะเป็นJNZ(Jump ถ้าไม่เป็นศูนย์) หรือเทียบเท่าบาง

ฉันสงสัยว่าคอมไพเลอร์พลาดการเพิ่มประสิทธิภาพที่ชัดเจนเช่นนี้แม้ว่าจะปิดการปรับให้เหมาะสมแล้วก็ตาม นี่คือประเภทของสิ่งต่าง ๆ ที่Peephole Optimizationออกแบบมาสำหรับ

แก้ไข:ผุดขึ้นมาอีกแล้วเรามาเพิ่มแอสเซมบลีกันเถอะ (LLVM 2.7 IR)

int regular(int c) {
  if (c == 0) { return 0; }
  return 1;
}

int yoda(int c) {
  if (0 == c) { return 0; }
  return 1;
}

define i32 @regular(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

define i32 @yoda(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

แม้ว่าใครจะไม่รู้วิธีอ่าน IR แต่ฉันก็คิดว่ามันอธิบายได้ด้วยตนเอง


4
@ Matthieu: คุณบอกว่าฉันยังไม่เห็นคำตอบที่ถูกต้อง .. แต่ของฉันถูกต้องฉันคิดว่า: P
Nawaz

7
ดี! คำตอบของคุณที่เป็นไปได้จะเปลี่ยน "คำถามที่โง่ที่สุด" เป็น "กลเม็ด / ยากที่สุด" "ลองขุดรูสำหรับผู้สมัครและดูว่าเขาตกอยู่ในนั้นหรือไม่ ... " :) ฉันเดาว่าเราคิดว่าflagต้องเป็นจำนวนเต็มหรือบูลีนโดยอัตโนมัติ OTOH การมีตัวแปรชื่อflagประเภทที่ผู้ใช้กำหนดนั้นค่อนข้างผิดในตัวเอง IMHO
davka

@Nawaz: ฉันอาจข้ามวรรคสุดท้ายของคำตอบของคุณ: p
Matthieu M.

1
@Nawaz: ฉันไม่ได้แข่งจริงๆฉันมักจะอ่านคำถามนานหลังจากที่พวกเขาได้รับคำตอบและผู้คนมักจะอ่านเฉพาะคำตอบที่ได้รับการโหวตมากที่สุดเป็นอันดับแรก :) แต่ฉันกำลังอ่านเนื้อหาเกี่ยวกับการเพิ่มประสิทธิภาพคอมไพเลอร์และสิ่งนี้ทำให้ฉันรู้สึกว่า กรณีทั่วไปของการเพิ่มประสิทธิภาพเล็กน้อยดังนั้นฉันคิดว่าฉันจะชี้ให้ผู้อ่านที่รำคาญจริงๆ ... ฉันค่อนข้างแปลกใจที่ได้รับคะแนนโหวตมากมาย ตอนนี้เป็นคำตอบที่ได้รับการโหวตมากที่สุดของฉันแม้ว่าจะไม่ใช่คำตอบที่ฉันใช้ความพยายามมากที่สุดก็ตาม: / อย่างไรก็ตามฉันแก้ไขคำตอบและแก้ไขคำพูดของฉัน :)
Matthieu M.

2
@mr_eclair: ประเภทในตัวคือประเภทที่ (ตามชื่อโดยนัย) ในภาษา นั่นคือสามารถใช้ได้แม้ไม่มี#includeคำสั่งเดียว เพื่อประโยชน์ของความเรียบง่ายก็มักจะมีจำนวนint, char, boolและชอบ ทุกประเภทอื่น ๆ จะกล่าวว่าเป็นผู้ใช้กำหนดนั่นคือพวกเขามีอยู่เพราะพวกเขาเป็นผลมาจากผู้ใช้บางพวกเขาประกาศ: typedef, enum, ,struct classตัวอย่างเช่นstd::stringผู้ใช้กำหนดแม้ว่าคุณจะไม่ได้กำหนดเองอย่างแน่นอน :)
Matthieu M.

56

รหัสเดียวกันสำหรับ amd64 กับ GCC 4.1.2:

        .loc 1 4 0  # int f = argc;
        movl    -20(%rbp), %eax
        movl    %eax, -4(%rbp)
        .loc 1 6 0 # if( f == 0 ) {
        cmpl    $0, -4(%rbp)
        jne     .L2
        .loc 1 7 0 # return 0;
        movl    $0, -36(%rbp)
        jmp     .L4
        .loc 1 8 0 # }
 .L2:
        .loc 1 10 0 # if( 0 == f ) {
        cmpl    $0, -4(%rbp)
        jne     .L5
        .loc 1 11 0 # return 1;
        movl    $1, -36(%rbp)
        jmp     .L4
        .loc 1 12 0 # }
 .L5:
        .loc 1 14 0 # return 2;
        movl    $2, -36(%rbp)
 .L4:
        movl    -36(%rbp), %eax
        .loc 1 15 0 # }
        leave
        ret

18
+1 สำหรับการก้าวไปอีกขั้นเพื่อพิสูจน์ว่าการเพิ่มประสิทธิภาพคอมไพเลอร์นั้นเหมือนกัน
k rey

56

จะไม่มีความแตกต่างในเวอร์ชันของคุณ

ฉันสมมติว่าtypeธงไม่ใช่ประเภทที่ผู้ใช้กำหนด แต่เป็นประเภทที่มีอยู่แล้วภายใน Enum เป็นข้อยกเว้น! . คุณสามารถรักษา enum ได้เหมือนในตัว ในความเป็นจริงค่าของมันเป็นหนึ่งในประเภทในตัว!

ในกรณีถ้ามันของผู้ใช้กำหนดชนิด (ยกเว้นenum) ==แล้วคำตอบทั้งหมดขึ้นอยู่กับวิธีการที่คุณได้มากเกินไปผู้ประกอบการ โปรดทราบว่าคุณต้องทำงานหนักเกินไป==โดยกำหนดสองฟังก์ชันหนึ่งฟังก์ชันสำหรับแต่ละเวอร์ชันของคุณ!


8
นี่อาจเป็นเหตุผลเดียวที่เป็นไปได้ที่จะถามคำถามนี้ IMHO
davka

15
ฉันจะแปลกใจมากถ้าคอมไพเลอร์สมัยใหม่พลาดการเพิ่มประสิทธิภาพที่ชัดเจนเช่นนี้
Pedro d'Aquino

3
เพื่อความรู้ของฉัน! ไม่ใช่การทำงานแบบบิต
Xavier Combelle

8
@Nawaz: ไม่ได้ลงคะแนน แต่คำตอบของคุณผิดจริงและมันแย่มากที่ยังคงได้รับการโหวตเพิ่มขึ้นมากมาย สำหรับเร็กคอร์ดการเปรียบเทียบจำนวนเต็มกับ 0 เป็นคำสั่งประกอบเดี่ยวโดยสมบูรณ์เทียบกับการปฏิเสธ ในความเป็นจริงถ้าคอมไพเลอร์โง่เล็กน้อยสิ่งนี้อาจเร็วกว่าการปฏิเสธ (ไม่น่าจะเป็นไปได้)
Konrad Rudolph

6
@Nawaz: ยังผิดที่จะบอกว่าทำได้จะหรือโดยปกติจะเร็วกว่า หากมีความแตกต่างเวอร์ชัน "เปรียบเทียบกับศูนย์" จะเร็วกว่าเนื่องจากการปฏิเสธจะแปลเป็นสองการดำเนินการ: "ปฏิเสธตัวดำเนินการตรวจสอบว่าผลลัพธ์ไม่ใช่ศูนย์" แน่นอนว่าในทางปฏิบัติคอมไพลเลอร์จะปรับให้เหมาะสมเพื่อให้ได้รหัสเดียวกันกับเวอร์ชัน "เปรียบเทียบกับศูนย์" ธรรมดา แต่การเพิ่มประสิทธิภาพจะถูกนำไปใช้กับเวอร์ชันปฏิเสธเพื่อให้ทันและไม่ใช่ในทางอื่น คอนราดอยู่พอดี
jalf

27

ไม่มีความแตกต่างอย่างแน่นอน

คุณอาจได้รับคะแนนในการตอบคำถามสัมภาษณ์นั้นโดยอ้างถึงการกำจัดความผิดพลาดในการมอบหมายงาน / การเปรียบเทียบแม้ว่า:

if (flag = 0)  // typo here
   {
   // code never executes
   }

if (0 = flag) // typo and syntactic error -> compiler complains
   {
   // ...
   }

แม้ว่าจะเป็นเรื่องจริง แต่เช่น C-compiler เตือนในกรณีของอดีต ( flag = 0) ไม่มีคำเตือนดังกล่าวใน PHP, Perl หรือ Javascript หรือ<insert language here>.


@Matthieu หือ. ฉันคงพลาดโพสต์เกี่ยวกับเมตาที่อธิบายถึงรูปแบบการค้ำยันที่ "เหมาะสม"
Linus Kleen

7
ฉันไม่ได้ลงคะแนนเลย แต่เพื่อสิ่งที่คุ้มค่า: เหตุใดจึงสำคัญที่ผู้คนอธิบายตัวเองทุกครั้งที่ลงคะแนน? การโหวตไม่ระบุชื่อโดยการออกแบบ ฉันไม่เห็นด้วยอย่างสิ้นเชิงกับความคิดที่ว่าผู้ลงคะแนนควรแสดงความคิดเห็นเสมอเพราะโดยส่วนตัวแล้วฉันไม่เคยต้องการให้ถือว่าเป็นผู้โหวตลดคะแนนเพียงเพราะฉันแสดงความคิดเห็นที่ชี้ให้เห็นปัญหา บางทีผู้โหวตคิดว่าคำตอบส่วนใหญ่ไม่เกี่ยวข้องกับคำถามความเร็ว? บางทีเขาอาจคิดว่ามันสนับสนุนรูปแบบการเขียนโค้ดที่เขาไม่เห็นด้วย? บางทีเขาอาจจะเป็นคนขี้งกและต้องการให้คำตอบของตัวเองมีคะแนนสูงสุด?
David Hedlund

3
ประชาชนควรมีอิสระในการลงคะแนนเสียงตามที่พวกเขาต้องการโดยไม่คำนึงถึงเหตุผล เมื่อมีชื่อเสียงแล้วนี่เป็นสิ่งที่ดีเกือบตลอดเวลาเนื่องจากมักจะกระตุ้นให้คนอื่นโหวตเพื่อต่อต้านการโหวตที่ไม่สมควรได้รับในความเป็นจริงการโหวตเพิ่มเพียงครั้งเดียวจะยกเลิกการโหวตที่ไม่สมควรได้รับห้าคะแนน
David Hedlund

26
@ เดวิด: ผู้โหวตควรอธิบายตัวเองเพราะไซต์นี้ไม่เกี่ยวกับการลงคะแนนความนิยมแบบลับ ๆ การลงคะแนนแบบไม่เปิดเผยตัวตนหรือสิ่งที่คล้ายกัน ไซต์นี้เกี่ยวกับการเรียนรู้ หากมีคนบอกว่าการตอบสนองไม่ถูกต้องโดยการลงคะแนนผู้ลงคะแนนจะเห็นแก่ตัวกับความรู้ของพวกเขาหากพวกเขาไม่อธิบายว่าทำไม พวกเขายินดีที่จะรับเครดิตทั้งหมดเมื่อพวกเขาถูกต้อง แต่ไม่เต็มใจที่จะแบ่งปันความรู้เมื่อคนอื่นทำผิด
John Dibling

1
เพื่อให้ประเด็นเรื่องสไตล์การค้ำจุนออกไปฉันคิดว่า Matthieu ตั้งใจเป็นเรื่องตลกจริงๆ ฉันประหลาดใจที่เห็นว่ามีใครโหวตบ้างขึ้นอยู่กับประเด็นดังกล่าว ต้องบอกว่าไม่ใช่ทุกคนที่ใช้คะแนนเสียงในลักษณะเดียวกันทั้งหมด ฉันเห็นเหตุผลในการลงคะแนนเนื่องจากโพสต์ดูเหมือนจะสนับสนุนรูปแบบการเข้ารหัสที่ผู้มีสิทธิเลือกตั้งอาจไม่เห็นด้วย (โปรดสังเกตความแตกต่างระหว่างการสนับสนุนรูปแบบการเข้ารหัส - "หากคุณเขียนโค้ดแบบนี้คุณจะได้รับข้อผิดพลาดของคอมไพเลอร์เมื่อคุณสร้าง พิมพ์ผิด "- และใช้รูปแบบการเข้ารหัสเช่นวงเล็บปีกกา) ในนั้น ...
David Hedlund

16

จะไม่มีความเร็วที่แตกต่างกันอย่างแน่นอน ทำไมต้องมี?


7
ถ้าคอมไพเลอร์ปัญญาอ่อนอย่างสมบูรณ์ นั่นเป็นเหตุผลเดียว
JeremyP

@JeremyP: ฉันนึกไม่ออกถึงความแตกต่างแม้ว่าคอมไพเลอร์จะปัญญาอ่อนก็ตาม ผู้เขียนคอมไพเลอร์จะต้องทำตามวัตถุประสงค์เท่าที่ฉันสามารถบอกได้
จอน

2
สมมติว่าโปรเซสเซอร์มีคำสั่ง "test if 0" x == 0อาจใช้ แต่0 == xอาจใช้การเปรียบเทียบแบบปกติ ฉันไม่ได้บอกว่ามันจะต้องปัญญาอ่อน
JeremyP

8
หากแฟ
ล็ก

เนื่องจากเราอาจมีvirtual operator==(int)ประเภทที่ผู้ใช้กำหนดเอง?
lorro

12

มีความแตกต่างเมื่อแฟล็กเป็นประเภทที่ผู้ใช้กำหนด

struct sInt
{
    sInt( int i ) : wrappedInt(i)
    {
        std::cout << "ctor called" << std::endl;
    }

    operator int()
    {
        std::cout << "operator int()" << std::endl;
        return wrappedInt;
    }

    bool operator==(int nComp)
    {
        std::cout << "bool operator==(int nComp)" << std::endl;
        return (nComp == wrappedInt);
    }

    int wrappedInt;
};

int 
_tmain(int argc, _TCHAR* argv[])
{
    sInt s(0);

    //in this case this will probably be faster
    if ( 0 == s )
    {
        std::cout << "equal" << std::endl;
    }

    if ( s == 0 )
    {
        std::cout << "equal" << std::endl;
    }
}

ในกรณีแรก (0 == s) ตัวดำเนินการแปลงถูกเรียกจากนั้นผลลัพธ์ที่ส่งกลับจะถูกเปรียบเทียบกับ 0 ในกรณีที่สองตัวดำเนินการ == ถูกเรียก


3
+1 สำหรับการระบุว่าตัวดำเนินการ Conversion อาจมีความเกี่ยวข้องเท่ากับโอเปอเรเตอร์ ==
Tony Delroy

11

เมื่อมีข้อสงสัยจงเปรียบเทียบและเรียนรู้ความจริง


2
เกิดอะไรขึ้นกับการเปรียบเทียบ? บางครั้งการปฏิบัติก็บอกคุณได้มากกว่าทฤษฎี
Elzo Valugi

1
นั่นคือคำตอบที่ฉันมองหาเมื่อเริ่มอ่านกระทู้นี้ ดูเหมือนว่าทฤษฎีจะน่าสนใจกว่าการปฏิบัติมองหาคำตอบและโหวตให้คะแนน :)
Samuel Rivas

เขาจะเปรียบเทียบในการสัมภาษณ์ได้อย่างไร? นอกจากนี้ฉันคิดว่าผู้สัมภาษณ์ไม่รู้ด้วยซ้ำว่าการเปรียบเทียบหมายถึงอะไรดังนั้นเขาอาจรู้สึกขุ่นเคือง
IAdapter

พวกเขาตอบคำถามได้ถูกต้อง (IMO) คือ "นั่นขึ้นอยู่กับคอมไพเลอร์และส่วนที่เหลือของโปรแกรมฉันจะเขียนเกณฑ์มาตรฐานและทดสอบใน 5 นาที"
Samuel Rivas

7

พวกเขาควรจะเหมือนกันทุกประการในแง่ของความเร็ว

อย่างไรก็ตามสังเกตว่าบางคนใช้ค่าคงที่ทางซ้ายในการเปรียบเทียบความเท่าเทียมกัน (ที่เรียกว่า "Yoda conditionals") เพื่อหลีกเลี่ยงข้อผิดพลาดทั้งหมดที่อาจเกิดขึ้นหากคุณเขียน=(ตัวดำเนินการกำหนด) แทน==(ตัวดำเนินการเปรียบเทียบความเท่าเทียมกัน) เนื่องจากการกำหนดให้ตัวอักษรทำให้เกิดข้อผิดพลาดในการคอมไพล์จึงหลีกเลี่ยงข้อผิดพลาดประเภทนี้

if(flag=0) // <--- typo: = instead of ==; flag is now set to 0
{
    // this is never executed
}

if(0=flag) // <--- compiler error, cannot assign value to literal
{

}

ในทางกลับกันคนส่วนใหญ่พบว่า "Yoda conditionals" ดูแปลกและน่ารำคาญโดยเฉพาะอย่างยิ่งเนื่องจากระดับของข้อผิดพลาดที่พวกเขาป้องกันสามารถถูกตรวจพบได้โดยใช้คำเตือนของคอมไพเลอร์ที่เหมาะสม

if(flag=0) // <--- warning: assignment in conditional expression
{

}

ขอบคุณสำหรับเสียงสะท้อน อย่างไรก็ตามโปรดทราบว่า PHP เช่นจะไม่เตือนในกรณีที่มีการกำหนดเงื่อนไข
Linus Kleen

5

อย่างที่คนอื่นบอกไม่มีความแตกต่าง

0จะต้องได้รับการประเมิน flagจะต้องได้รับการประเมิน กระบวนการนี้ใช้เวลาเท่ากันไม่ว่าจะวางไว้ด้านใดก็ตาม

คำตอบที่ถูกต้องคือทั้งคู่มีความเร็วเท่ากัน

แม้แต่นิพจน์if(flag==0)และif(0==flag)มีจำนวนอักขระเท่ากัน! หากหนึ่งในนั้นถูกเขียนเป็นif(flag== 0)คอมไพเลอร์จะมีพื้นที่พิเศษสำหรับแยกวิเคราะห์ดังนั้นคุณจะมีเหตุผลที่ถูกต้องในการระบุเวลาในการคอมไพล์

แต่เนื่องจากไม่มีสิ่งนั้นจึงไม่มีเหตุผลอย่างแน่นอนว่าทำไมเราจึงควรเร็วกว่าอย่างอื่น หากมีเหตุผลแสดงว่าคอมไพเลอร์กำลังทำสิ่งที่แปลกประหลาดมากในการสร้างโค้ด ...


5

อันไหนเร็วขึ้นอยู่กับรุ่นของ == ที่คุณใช้ นี่คือตัวอย่างข้อมูลที่ใช้ 2 การใช้งานที่เป็นไปได้ของ == และขึ้นอยู่กับว่าคุณเลือกที่จะเรียก x == 0 หรือ 0 == x หนึ่งใน 2 ตัวเลือก

หากคุณเพิ่งใช้ POD สิ่งนี้ไม่ควรสำคัญเมื่อต้องใช้ความเร็ว

#include <iostream>
using namespace std;

class x { 
  public:
  bool operator==(int x) { cout << "hello\n"; return 0; }
  friend bool operator==(int x, const x& a) { cout << "world\n"; return 0; } 
};

int main()
{ 
   x x1;
   //int m = 0;
   int k = (x1 == 0);
   int j = (0 == x1);
}

5

ฉันเห็นด้วยอย่างสมบูรณ์กับสิ่งที่กล่าวไว้ในความคิดเห็นต่อ OP เพื่อประโยชน์ในการออกกำลังกาย:

หากคอมไพเลอร์ไม่ฉลาดพอ (คุณไม่ควรใช้) หรือปิดใช้งานการเพิ่มประสิทธิภาพx == 0สามารถคอมไพล์ตามjump if zeroคำสั่งแอสเซมบลีเนทีฟได้ในขณะที่0 == xอาจเป็นการเปรียบเทียบค่าตัวเลขทั่วไป (และเสียค่าใช้จ่าย) มากกว่า

ถึงกระนั้นฉันก็ไม่อยากทำงานให้กับเจ้านายที่คิดในแง่เหล่านี้ ...


4

แน่นอนว่าไม่มีความแตกต่างในแง่ของความเร็วในการดำเนินการ เงื่อนไขจะต้องได้รับการประเมินในทั้งสองกรณีในลักษณะเดียวกัน


3

ฉันคิดว่าคำตอบที่ดีที่สุดคือ "ตัวอย่างนี้เป็นภาษาอะไร"

คำถามไม่ได้ระบุภาษาและมีการติดแท็กทั้ง 'C' และ 'C ++' คำตอบที่แม่นยำต้องการข้อมูลเพิ่มเติม

มันเป็นคำถามเกี่ยวกับการเขียนโปรแกรมที่น่าเบื่อ แต่มันอาจจะดีสำหรับแผนก "ขอให้ผู้ให้สัมภาษณ์มีเชือกเพียงพอที่จะแขวนคอตัวเองหรือสร้างชิงช้าบนต้นไม้" ปัญหาของคำถามประเภทนี้คือพวกเขามักจะเขียนและส่งต่อจากผู้สัมภาษณ์ไปยังผู้สัมภาษณ์จนกว่าจะถึงคนที่ไม่เข้าใจจริงๆจากทุกมุม


3

สร้างโปรแกรมง่ายๆสองโปรแกรมโดยใช้วิธีที่แนะนำ

รวบรวมรหัส ดูการชุมนุมแล้วคุณสามารถตัดสินได้ แต่ฉันสงสัยว่ามีความแตกต่าง!

การสัมภาษณ์ต่ำลงกว่าที่เคย


2

เช่นกัน (ฉันคิดว่าคอมไพเลอร์ที่เหมาะสมจะทำให้คำถามนี้สงสัยเพราะมันจะปรับให้เหมาะสม) การใช้ 0 == flag over flag == 0 จะป้องกันการพิมพ์ผิดที่คุณลืมหนึ่งใน = (เช่นถ้าคุณพิมพ์โดยไม่ได้ตั้งใจ flag = 0 มันจะคอมไพล์ แต่ 0 = flag จะไม่) ซึ่งฉันคิดว่ามันเป็นข้อผิดพลาดที่ทุกคนทำในจุดใดจุดหนึ่ง ...


0

หากมีความแตกต่างกันสิ่งที่หยุดคอมไพเลอร์เพื่อเลือกเร็วกว่าครั้งเดียว? เหตุผลไม่มีความแตกต่างใด ๆ อาจเป็นสิ่งที่ผู้สัมภาษณ์คาดหวัง เป็นคำถามที่ยอดเยี่ยมจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.