ความแตกต่างระหว่าง i ++ และ ++ i คืออะไร?


204

ผมเคยเห็นพวกเขาทั้งสองถูกนำมาใช้ในหลายชิ้นของรหัส C # และฉันต้องการที่จะทราบเมื่อมีการใช้i++หรือ++i( iเป็นตัวแปรจำนวนเช่นint, float, doubleฯลฯ ) ใครที่รู้เรื่องนี้


13
ยกเว้นในกรณีที่ไม่มีความแตกต่างใด ๆ คุณไม่ควรใช้อย่างใดอย่างหนึ่งเพราะจะทำให้ผู้คนถามคำถามเดียวกันกับที่คุณถามตอนนี้ "อย่าทำให้ฉันคิดว่า" ใช้กับรหัสเช่นเดียวกับการออกแบบ
อินสแตนซ์ฮันเตอร์


2
@Dlaor: คุณได้อ่านลิงก์ในความคิดเห็นของฉันหรือยัง? ข้อแรกคือประมาณ C # และอันที่สองเป็นผู้ไม่เชื่อเรื่องภาษากับคำตอบที่ได้รับการยอมรับซึ่งมุ่งเน้นที่ C #
gnovice

7
@gnovice คนแรกถามถึงความแตกต่างของประสิทธิภาพในขณะที่ฉันถามถึงความแตกต่างที่ชาญฉลาดของรหัสจริงที่สองคือเกี่ยวกับความแตกต่างในวงในขณะที่ฉันถามความแตกต่างโดยทั่วไปและที่สามคือเกี่ยวกับ C ++
Dlaor

1
ฉันเชื่อว่านี่ไม่ใช่ความแตกต่างระหว่าง i ++ และ ++ i ในการวนซ้ำหรือไม่ - ดังที่ Dloar กล่าวไว้ในความคิดเห็นของเขาเหนือคำถามอื่น ๆ ถามโดยเฉพาะเกี่ยวกับการใช้ภายในลูป
chue x

คำตอบ:


201

ดูเหมือนว่าคำตอบอีกสองคำไม่ได้สะกดออกมาและมันก็คุ้มที่จะพูดว่า:


i++หมายถึง 'บอกฉันถึงคุณค่าของการiเพิ่มขึ้นแล้ว'

++iหมายถึง 'การเพิ่มขึ้นiแล้วบอกค่า'


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


11
ดูเหมือนจะขัดแย้งกับสิ่งที่Eric พูด
Evan Carroll

65
คำสั่งไม่ถูกต้อง พิจารณาคำแถลงแรกของคุณ i ++ หมายถึง "บันทึกค่าเพิ่มขึ้นเก็บไว้ใน i จากนั้นบอกค่าเดิมที่บันทึกไว้" นั่นคือการบอกเกิดขึ้นหลังจากการเพิ่มขึ้นไม่ใช่ก่อนหน้านี้ตามที่คุณระบุไว้ พิจารณาข้อความที่สอง i ++ หมายถึง "บันทึกค่าเพิ่มขึ้นเก็บไว้ใน i และบอกค่าเพิ่ม" วิธีที่คุณพูดมันทำให้ไม่ชัดเจนว่าค่านั้นเป็นค่าของ i หรือค่าที่กำหนดให้ i; พวกเขาอาจจะแตกต่างกัน
Eric Lippert

8
@Eric มันจะดูเหมือนกับคำตอบของคุณแม้แต่คำสั่งที่สองก็ถูกต้องอย่างเด็ดขาด แม้ว่าเขาจะไม่กี่ก้าว
Evan Carroll

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

12
@supercat: การสนทนาเกี่ยวกับ C # ไม่ใช่ C.
Thanatos

428

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

ไม่น่าแปลกใจเลยที่คุณจะเห็นคำตอบที่ผิดมากสำหรับคำถามนี้ หนังสือ "สอนตัวเอง C #" ที่ยอดเยี่ยมมากมายก็เข้าใจผิดเช่นกัน นอกจากนี้วิธีที่ C # ทำนั้นแตกต่างจากวิธีที่ C ทำ หลายคนคิดว่า C # และ C เป็นภาษาเดียวกัน พวกเขาจะไม่. การออกแบบตัวเพิ่มและลดตัวดำเนินการใน C # ในความคิดของฉันหลีกเลี่ยงข้อบกพร่องในการออกแบบของตัวดำเนินการเหล่านี้ใน C

มีคำถามสองข้อที่ต้องตอบเพื่อพิจารณาว่าการทำงานของคำนำหน้าและ postfix ++ เป็นอย่างไรใน C # คำถามแรกคือผลลัพธ์คืออะไร และคำถามที่สองคือเมื่อใดที่มีผลข้างเคียงของการเพิ่มขึ้นเกิดขึ้น?

ไม่ชัดเจนว่าคำตอบของทั้งสองคำถามคืออะไร แต่จริงๆแล้วมันค่อนข้างง่ายเมื่อคุณเห็น ให้ฉันสะกดให้คุณอย่างแม่นยำว่า x ++ และ ++ x ทำอะไรกับตัวแปร x

สำหรับแบบฟอร์มคำนำหน้า (++ x):

  1. x ถูกประเมินเพื่อสร้างตัวแปร
  2. ค่าของตัวแปรจะถูกคัดลอกไปยังตำแหน่งชั่วคราว
  3. ค่าชั่วคราวถูกเพิ่มค่าเพื่อสร้างค่าใหม่ (ไม่เขียนทับค่าชั่วคราว!)
  4. ค่าใหม่จะถูกเก็บไว้ในตัวแปร
  5. ผลลัพธ์ของการดำเนินการคือค่าใหม่ (เช่นค่าที่เพิ่มขึ้นของชั่วคราว)

สำหรับแบบฟอร์ม postfix (x ++):

  1. x ถูกประเมินเพื่อสร้างตัวแปร
  2. ค่าของตัวแปรจะถูกคัดลอกไปยังตำแหน่งชั่วคราว
  3. ค่าชั่วคราวถูกเพิ่มค่าเพื่อสร้างค่าใหม่ (ไม่เขียนทับค่าชั่วคราว!)
  4. ค่าใหม่จะถูกเก็บไว้ในตัวแปร
  5. ผลลัพธ์ของการดำเนินการคือค่าของชั่วคราว

สิ่งที่ควรสังเกต:

ครั้งแรกลำดับของเหตุการณ์ที่เกิดขึ้นในเวลาที่จะเหมือนกันในทั้งสองกรณี อีกครั้งไม่ใช่กรณีที่ลำดับเหตุการณ์ในเวลาเปลี่ยนแปลงระหว่างคำนำหน้าและ postfix มันผิดทั้งหมดที่จะบอกว่าการประเมินเกิดขึ้นก่อนการประเมินอื่น ๆ หรือหลังการประเมินอื่น ๆ การประเมินเกิดขึ้นในลำดับเดียวกันในทั้งสองกรณีอย่างที่คุณเห็นในขั้นตอนที่ 1 ถึง 4 เหมือนกัน ความแตกต่างเพียงอย่างเดียวคือขั้นตอนสุดท้าย - ไม่ว่าผลลัพธ์จะเป็นค่าของชั่วคราวหรือค่าใหม่ที่เพิ่มขึ้น

คุณสามารถสาธิตสิ่งนี้ได้อย่างง่ายดายด้วยแอพคอนโซล C #:

public class Application
{
    public static int currentValue = 0;

    public static void Main()
    {
        Console.WriteLine("Test 1: ++x");
        (++currentValue).TestMethod();

        Console.WriteLine("\nTest 2: x++");
        (currentValue++).TestMethod();

        Console.WriteLine("\nTest 3: ++x");
        (++currentValue).TestMethod();

        Console.ReadKey();
    }
}

public static class ExtensionMethods 
{
    public static void TestMethod(this int passedInValue) 
    {
        Console.WriteLine("Current:{0} Passed-in:{1}",
            Application.currentValue,
            passedInValue);
    }
}

นี่คือผลลัพธ์ ...

Test 1: ++x
Current:1 Passed-in:1

Test 2: x++
Current:2 Passed-in:1

Test 3: ++x
Current:3 Passed-in:3

ในการทดสอบครั้งแรกคุณจะเห็นว่าทั้งสองcurrentValueและสิ่งที่ผ่านไปTestMethod()ส่วนขยายแสดงค่าเดียวกันตามที่คาดไว้

อย่างไรก็ตามในกรณีที่สองผู้คนจะพยายามบอกคุณว่าการเพิ่มcurrentValueขึ้นเกิดขึ้นหลังจากการโทรTestMethod()แต่อย่างที่คุณเห็นจากผลลัพธ์มันเกิดขึ้นก่อนการโทรดังที่ระบุไว้โดยผลลัพธ์ 'ปัจจุบัน: 2'

ในกรณีนี้ค่าแรกของcurrentValueจะถูกเก็บไว้ในชั่วคราว ถัดไปเวอร์ชันที่เพิ่มขึ้นของค่านั้นจะถูกเก็บไว้ในcurrentValueแต่ไม่ต้องสัมผัสชั่วคราวซึ่งยังคงเก็บค่าดั้งเดิมไว้ TestMethod()สุดท้ายว่าชั่วคราวจะถูกส่งไป หากการเพิ่มขึ้นเกิดขึ้นหลังจากการเรียกไปTestMethod()แล้วมันจะเขียนออกมาเหมือนกันไม่ใช่ค่าที่เพิ่มขึ้นสองครั้ง แต่มันไม่ได้

สิ่งสำคัญคือโปรดทราบว่าค่าที่ส่งคืนจากทั้งสองcurrentValue++และ++currentValueการดำเนินงานจะขึ้นอยู่กับชั่วคราวและไม่ใช่ค่าจริงที่เก็บไว้ในตัวแปรในเวลาที่การดำเนินการอย่างใดอย่างหนึ่งออก

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

กล่าวง่ายๆคือเวอร์ชัน postfix จะส่งคืนค่าที่อ่านจากตัวแปร (เช่นค่าของชั่วคราว) ในขณะที่รุ่นคำนำหน้าจะส่งคืนค่าที่ถูกเขียนกลับไปที่ตัวแปร (เช่นค่าที่เพิ่มขึ้นของชั่วคราว) ไม่ส่งคืนค่าของตัวแปร

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

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

https://ericlippert.com/2009/08/10/precedence-vs-order-redux/

ซึ่งนำไปสู่คำถาม SO นี้:

int [] arr = {0}; int value = arr [arr [0] ++]; ค่า = 1?

คุณอาจสนใจในบทความก่อนหน้าของฉันในเรื่อง:

https://ericlippert.com/2008/05/23/precedence-vs-associativity-vs-order/

และ

https://ericlippert.com/2007/08/14/c-and-the-pit-of-despair/

และกรณีที่น่าสนใจที่ C ทำให้มันยากที่จะให้เหตุผลเกี่ยวกับความถูกต้อง:

https://docs.microsoft.com/archive/blogs/ericlippert/bad-recursion-revisited

นอกจากนี้เราพบปัญหาที่ละเอียดอ่อนเช่นเดียวกันเมื่อพิจารณาการดำเนินการอื่น ๆ ที่มีผลข้างเคียงเช่นการมอบหมายอย่างง่าย:

https://docs.microsoft.com/archive/blogs/ericlippert/chaining-simple-assignments-is-not-so-simple

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

เหตุใดฉันจึงไม่สามารถใช้ ++ i ++ ในภาษาที่เหมือน C ได้


4
+1: สำหรับสิ่งที่อยากรู้อยากเห็นอย่างแท้จริงคุณสามารถอ้างอิงถึงสิ่งที่คุณหมายถึงโดย "ข้อบกพร่องการออกแบบของการดำเนินการเหล่านี้ใน C" หรือไม่?
Justin Ardini

21
@ จัสติน: ฉันได้เพิ่มลิงก์บางอย่าง แต่โดยทั่วไป: ใน C คุณไม่มีการรับประกันใด ๆ เกี่ยวกับสิ่งที่เกิดขึ้นในเวลา คอมไพเลอร์ที่เข้ากันได้สามารถทำสิ่งใด ๆ ที่มันพอใจได้เมื่อมีการผ่าเหล่าสองจุดในจุดลำดับเดียวกันและไม่จำเป็นต้องบอกคุณว่าคุณกำลังทำบางสิ่งที่เป็นพฤติกรรมที่กำหนดโดยการนำไปปฏิบัติ สิ่งนี้นำไปสู่การเขียนโค้ดอันตรายที่ไม่สามารถพกพาได้ซึ่งทำงานกับคอมไพเลอร์บางตัวและทำสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Eric Lippert

14
ฉันต้องบอกว่าสำหรับผู้ที่มีความอยากรู้อยากเห็นจริง ๆ นี่เป็นความรู้ที่ดี แต่สำหรับแอปพลิเคชัน C # โดยเฉลี่ยความแตกต่างระหว่างถ้อยคำในคำตอบอื่น ๆ และสิ่งที่เกิดขึ้นจริงนั้นอยู่ต่ำกว่าระดับนามธรรมของภาษา ไม่แตกต่าง. C # ไม่ใช่แอสเซมเบลอร์และจาก 99.9% ของเวลาi++หรือ++iถูกใช้ในโค้ดสิ่งต่าง ๆ ที่เกิดขึ้นในพื้นหลังก็เป็นเช่นนั้น ในพื้นหลัง ฉันเขียน C # เพื่อปีนขึ้นไปสู่ระดับที่เป็นนามธรรมเหนือสิ่งที่เกิดขึ้นในระดับนี้ดังนั้นหากสิ่งนี้สำคัญสำหรับรหัส C # ของคุณคุณอาจเป็นภาษาผิด
Tomas Aschan

24
@ โทมัส: ก่อนอื่นเลยฉันกังวลเกี่ยวกับแอปพลิเคชัน C # ทั้งหมดไม่ใช่เฉพาะแอปพลิเคชันขนาดใหญ่ทั่วไป จำนวนแอปพลิเคชันที่ไม่ใช่ค่าเฉลี่ยมีขนาดใหญ่ ประการที่สองก็จะทำให้ไม่แตกต่างกันยกเว้นในกรณีที่มันทำให้ความแตกต่าง ฉันได้รับคำถามเกี่ยวกับสิ่งนี้ขึ้นอยู่กับข้อบกพร่องจริงในรหัสจริงอาจครึ่งโหลครั้งต่อปี สามฉันเห็นด้วยกับประเด็นที่ใหญ่กว่าของคุณ แนวคิดทั้งหมดของ ++ เป็นแนวคิดระดับต่ำมากที่ดูแปลกตามากในโค้ดสมัยใหม่ มีเฉพาะที่นี่เท่านั้นเพราะมันเป็นสำนวนที่ภาษา C เหมือนมีโอเปอเรเตอร์เช่นนั้น
Eric Lippert

11
+1 แต่ฉันต้องบอกความจริง ... เป็นเวลาหลายปีแล้วที่การใช้ตัวดำเนินการ postfix อย่างเดียวที่ฉันทำไม่ได้อยู่คนเดียวในแถว (ดังนั้นไม่ใช่แบบi++;นั้น) อยู่ในfor (int i = 0; i < x; i++)... และฉันก็เป็นอย่างมาก มีความสุขกับสิ่งนี้! (และฉันไม่เคยใช้โอเปอเรเตอร์คำนำหน้า) ถ้าฉันต้องเขียนสิ่งที่ต้องใช้โปรแกรมเมอร์ระดับสูง 2 นาทีในการถอดรหัส ... ดี ... ดีกว่าที่จะเขียนโค้ดอีกหนึ่งบรรทัดหรือแนะนำตัวแปรชั่วคราว :-) ฉันคิดว่า "บทความ" ของคุณ (ฉันชนะ ไม่เรียกว่า "คำตอบ") พิสูจน์ตัวเลือกของฉัน :-)
xanatos

23

ถ้าคุณมี:

int i = 10;
int x = ++i;

แล้วจะเป็นx11

แต่ถ้าคุณมี:

int i = 10;
int x = i++;

แล้วจะเป็นx10

โปรดสังเกตว่า Eric ชี้ให้เห็นว่าการเพิ่มขึ้นนั้นเกิดขึ้นพร้อมกันในทั้งสองกรณี แต่เป็นค่าที่ได้รับเนื่องจากผลลัพธ์ที่แตกต่าง (ขอบคุณ Eric!)

โดยทั่วไปแล้วฉันชอบที่จะใช้++iเว้นแต่จะมีเหตุผลที่ดีที่จะไม่ ตัวอย่างเช่นเมื่อเขียนลูปฉันชอบใช้:

for (int i = 0; i < 10; ++i) {
}

หรือถ้าฉันต้องการเพิ่มตัวแปรฉันชอบที่จะใช้:

++x;

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


2
คุณสามารถอธิบายตัวอย่างของคุณได้โดยใส่บรรทัดโค้ดตามลำดับนั่นคือพูดว่า "var x = 10; var y = ++ x;" และ "var x = 10; var y = x ++;" แทน.
Tomas Aschan

21
คำตอบนี้ผิดอย่างอันตราย เมื่อการเพิ่มขึ้นไม่เปลี่ยนแปลงตามการดำเนินการที่เหลือดังนั้นบอกว่าในกรณีหนึ่งจะทำก่อนการดำเนินการที่เหลืออยู่และในอีกกรณีจะดำเนินการหลังจากการดำเนินการที่เหลืออยู่ทำให้เข้าใจผิดอย่างลึกซึ้ง การเพิ่มขึ้นของที่จะทำในเวลาเดียวกันในทั้งสองกรณี สิ่งที่แตกต่างกันเป็นสิ่งที่มีค่าจะได้รับเป็นผลที่ได้ไม่เมื่อเพิ่มขึ้นจะทำ
Eric Lippert

3
ฉันได้แก้ไขสิ่งนี้เพื่อใช้iสำหรับชื่อตัวแปรแทนที่จะvarเป็นคำหลัก C #
Jeff Yates

2
ดังนั้นโดยไม่ต้องกำหนดตัวแปรและเพียงระบุ "i ++;" หรือ "++ i;" จะให้ผลลัพธ์เดียวกันทั้งหมดหรือฉันได้รับผิด
Dlaor

1
@Eric: คุณช่วยอธิบายได้ไหมว่าทำไมข้อความดั้งเดิมถึงเป็น "อันตราย" มันนำไปสู่การใช้งานที่ถูกต้องแม้ว่ารายละเอียดจะไม่ถูกต้อง
Justin Ardini

7
int i = 0;
Console.WriteLine(i++); // Prints 0. Then value of "i" becomes 1.
Console.WriteLine(--i); // Value of "i" becomes 0. Then prints 0.

สิ่งนี้ตอบคำถามของคุณหรือไม่


4
อาจคิดได้ว่าการเพิ่ม postfix และการลด prefix นั้นไม่มีผลกับตัวแปร: P
Andreas

5

วิธีการทำงานของโอเปอเรเตอร์คือมันได้รับการเพิ่มขึ้นในเวลาเดียวกัน แต่ถ้ามันอยู่ก่อนตัวแปรนิพจน์จะประเมินด้วยตัวแปรที่เพิ่ม / ลดลง:

int x = 0;   //x is 0
int y = ++x; //x is 1 and y is 1

หากเป็นหลังตัวแปรคำสั่งปัจจุบันจะถูกเรียกใช้งานด้วยตัวแปรดั้งเดิมราวกับว่ายังไม่ได้ถูกเพิ่ม / ลดระดับ:

int x = 0;   //x is 0
int y = x++; //'y = x' is evaluated with x=0, but x is still incremented. So, x is 1, but y is 0

ฉันเห็นด้วยกับ dcp ในการใช้ pre-increment / decrement (++ x) เว้นแต่จำเป็น จริงๆครั้งเดียวที่ฉันใช้ post-increment / decrement อยู่ในขณะที่ลูปหรือลูปของการเรียงลำดับนั้น ลูปเหล่านี้เหมือนกัน:

while (x < 5)  //evaluates conditional statement
{
    //some code
    ++x;       //increments x
}

หรือ

while (x++ < 5) //evaluates conditional statement with x value before increment, and x is incremented
{
    //some code
}

คุณยังสามารถทำสิ่งนี้ได้ขณะทำดัชนีอาร์เรย์และเช่น:

int i = 0;
int[] MyArray = new int[2];
MyArray[i++] = 1234; //sets array at index 0 to '1234' and i is incremented
MyArray[i] = 5678;   //sets array at index 1 to '5678'
int temp = MyArray[--i]; //temp is 1234 (becasue of pre-decrement);

ฯลฯ


4

สำหรับระเบียนใน C ++ หากคุณสามารถใช้ (เช่น) คุณไม่สนใจเกี่ยวกับการสั่งซื้อการดำเนินการ (คุณเพียงต้องการเพิ่มหรือลดและใช้ในภายหลัง) ตัวดำเนินการคำนำหน้าจะมีประสิทธิภาพมากกว่าเนื่องจากไม่ ต้องสร้างสำเนาชั่วคราวของวัตถุ น่าเสียดายที่คนส่วนใหญ่ใช้ posfix (var ++) แทนคำนำหน้า (++ var) เพียงเพราะนั่นคือสิ่งที่เราเรียนรู้ในตอนแรก (ฉันถูกถามเกี่ยวกับเรื่องนี้ในการสัมภาษณ์) ไม่แน่ใจว่านี่จะเป็นจริงใน C # แต่ฉันคิดว่ามันจะเป็น


2
นั่นเป็นเหตุผลที่ฉันใช้ ++ i ใน c # ถึงเมื่อใช้คนเดียว (เช่นไม่ได้อยู่ในนิพจน์ที่ใหญ่กว่า) เมื่อใดก็ตามที่ฉันเห็น ac # loop กับ i ++ ฉันร้องไห้เล็กน้อย แต่ตอนนี้ฉันรู้แล้วว่าใน c # นี่เป็นรหัสเดียวกันที่ฉันรู้สึกดีกว่า โดยส่วนตัวแล้วฉันจะยังคงใช้ ++ ฉันเพราะนิสัยตายยาก
Mikle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.