x หลัง“ x = x ++” คืออะไร?


285

เกิดอะไรขึ้น (ด้านหลังม่าน) เมื่อดำเนินการสิ่งนี้

int x = 7;
x = x++;

นั่นคือเมื่อตัวแปรถูกโพสต์เพิ่มขึ้นและกำหนดให้กับตัวเองในหนึ่งคำสั่ง? ฉันรวบรวมและดำเนินการนี้ xยังคงเป็น 7 แม้หลังจากคำสั่งทั้งหมด ในหนังสือของฉันมันบอกว่าxมันเพิ่มขึ้น!


9
ลองสิ่งนี้: int x = 7; x = ++x;แน่นอนว่ายังเป็นรหัสที่น่ากลัวคุณไม่จำเป็นต้องกำหนดใหม่ int x = 7; x++;ก็เพียงพอแล้ว
stivlo

7
นี่เป็นวิธีปฏิบัติที่ไม่ดีจริงๆอย่าเพิ่มตัวแปรในบรรทัดเดียวกับที่คุณใช้
Yousf

5
ฉันต้องการใช้x += 1ยกเว้นในลูป for(int x=0; x<7; x++)
Svish

2
@ Andyortlieb ไม่มีวัตถุเพียงแค่ค่าพื้นฐาน
fortran

คำตอบ:


301

xจะได้รับเพิ่มขึ้น แต่คุณกำลังกำหนดค่าเก่าของxกลับเข้าไปในตัวมันเอง


x = x++;
  1. x++เพิ่มxและคืนค่าเดิม
  2. x = กำหนดค่าเก่าให้กับตัวเอง

ดังนั้นในที่สุดxได้รับมอบหมายกลับไปที่ค่าเริ่มต้น


3
จากนั้นสิ่งที่คุณจะพูดเกี่ยวกับ x = ++ x;
Hisham Muneer

3
@HishamMuneer ได้รับเพิ่มขึ้นเป็นครั้งแรกก่อนที่จะอ่านในกรณีที่คุณจึงจบลงด้วยx x + 1

@HishamMuneer มันสายเกินไปแล้ว แต่ฉันวางไว้ที่นี่เพราะมันอาจจะเป็นประโยชน์สำหรับคนอื่นที่จะมองในอนาคต วิธีที่ดีที่สุดที่จะอยู่ภายใต้ปัญหานี้คือการดูรหัสประกอบที่สร้างขึ้นสำหรับ x = x ++ และ x = ++ x โปรดดูคำตอบของ Thinkingcap ด้วย
nantitv

ฉันรู้ว่ามันเก่ามาก แต่ฉันมีคำถาม ลำดับการดำเนินการข้างต้นรับประกันโดยมาตรฐานหรือไม่ เป็นไปได้หรือไม่ที่การมอบหมายนั้นจะดำเนินการก่อนการเพิ่มขึ้น?
Emerald Weapon

@EmeraldWeapon มันถูกกำหนดใน Java มันมีเฉพาะใน C / C ++ เท่านั้นที่คุณเห็นประเภทของ shenanigans
Mysticial

385
x = x++;

เทียบเท่ากับ

int tmp = x;
x++;
x = tmp;

46
ฮ่า ๆ ๆ ใช่สำหรับคำจำกัดความซ้ำ คุณน่าจะทำเสร็จx=x+1แทนx++
user606723

8
@ user606723: เลขที่ฉันหมายถึงคำสั่งทั้งหมดx = x++ไม่เพียง x++แต่เพิ่มขึ้นโพสต์
เจ้าชายจอห์นเวสลีย์

20
ฉันไม่คิดว่านี่เป็นประโยชน์ทั้งหมดหากไม่มีคำอธิบายเพิ่มเติม ตัวอย่างเช่นมันไม่เป็นความจริงที่x = ++x;เทียบเท่ากับint tmp = x; ++x; x = tmp;ดังนั้นเราสามารถอนุมานได้ว่าคำตอบของคุณถูกต้อง (โดยเป็นเหตุผลอะไร)
kvb

4
ชัดเจนยิ่งขึ้นมันอยู่ในasm x=x++ =MOV x,tmp; INC x; MOV tmp,x
forker

3
@forker: ผมคิดว่ามันจะเป็นที่ชัดเจนถ้าคุณใช้คำแนะนำการชุมนุมที่นำไปใช้กับการประมวลผลของไมเคิลจะใช้;)
คาร์ล

258

คำสั่ง:

x = x++;

เทียบเท่ากับ:

tmp = x;   // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
           //     happens after the value is captured.
x = tmp;   // ... this is the effect of assignment operation which is
           //     (unfortunately) clobbering the incremented value.

ในระยะสั้นคำสั่งไม่มีผล

ประเด็นสำคัญ:

  • ค่าของนิพจน์การเพิ่ม / ลดการ Postfix คือค่าของตัวถูกดำเนินการก่อนที่จะมีการเพิ่ม / ลดลง (ในกรณีของแบบฟอร์มคำนำหน้าค่าเป็นค่าของตัวถูกดำเนินการหลังจากการดำเนินการ)

  • RHS ของการแสดงออกที่ได้รับมอบหมายจะถูกประเมินอย่างสมบูรณ์ (รวมถึงการเพิ่มขึ้นการลดลงและ / หรือผลข้างเคียงอื่น ๆ ) ก่อนที่ค่าจะถูกกำหนดให้กับ LHS

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


ในกรณีที่ไม่ชัดเจน:

  • "x = x ++;" เป็นความผิดพลาดอย่างแน่นอนในโปรแกรมใด ๆ
  • OP (สำหรับคำถามเดิม!) อาจหมายถึง "x ++;" แทนที่จะเป็น "x = x ++;"
  • งบที่รวม Inc อัตโนมัติ / ลดลงและการมอบหมายในตัวแปรเดียวกันจะยากที่จะเข้าใจและดังนั้นจึงควรหลีกเลี่ยงโดยไม่คำนึงถึงความถูกต้องของพวกเขา ไม่จำเป็นต้องเขียนโค้ดอย่างนั้น

หวังว่าผู้ตรวจสอบรหัสเช่น FindBugs และ PMD จะทำเครื่องหมายรหัสเช่นนี้ว่าเป็นที่น่าสงสัย


7
ตามบันทึกข้าง, OP คุณอาจหมายถึงเพียงแค่พูดแทนx++ x = x++
Jon Newmuis

3
ถูกต้อง แต่อาจเน้นว่าการเพิ่มขึ้นเกิดขึ้นหลังการประเมินการแสดงออกทางขวามือ แต่การมอบหมายล่วงหน้าไปทางซ้ายมือดังนั้น "overwrite" ที่ชัดเจนจึงปรากฏ
โบฮีเมียน

2
ที่ดูเหมือนว่าเป็นหนึ่งใน twisters การเขียนโปรแกรมโรงเรียนมัธยมที่ดีที่จะล้างพื้นฐานของคุณ!
kumarharsh

1
@Alberto - เป็นเรื่องดีที่ได้ยินว่าคุณไม่ได้ใช้คำว่า "ผู้เชี่ยวชาญ" ในฐานะ "ความจริงของพระกิตติคุณ" อย่างไรก็ตามวิธีที่ดีกว่าในการตรวจสอบสิ่งที่ฉันพูดจะปรึกษากับ JLS การทดสอบคอมไพล์ / เดคอมไพล์ของคุณแสดงให้เห็นว่าสิ่งที่ฉันพูดนั้นใช้ได้สำหรับคอมไพเลอร์ Java เดียวเท่านั้น คนอื่นสามารถ (สมมุติ) ประพฤติแตกต่างกัน ... ยกเว้น JLS ที่ไม่อนุญาต
สตีเฟ่นซี

4
เพียงแค่ FYI: สิ่งนี้ถูกโพสต์ในคำถามที่แตกต่างกันซึ่งถูกปิดเป็นซ้ำกับคำถามนี้และตอนนี้ได้ถูกรวมเข้าด้วยกัน
Shog9

33
int x = 7;
x = x++;

มันมีพฤติกรรมที่ไม่ได้กำหนดใน Cและสำหรับ Java เห็นคำตอบนี้ มันขึ้นอยู่กับคอมไพเลอร์ว่าเกิดอะไรขึ้น


4
ไม่มันไม่ได้ขึ้นอยู่กับคอมไพเลอร์ตามคำตอบที่คุณอ้าง - โปรดแก้ไข - -1 สำหรับตอนนี้
Mr_and_Mrs_D

@Mr_and_Mrs_D ถ้าอย่างนั้นมันขึ้นอยู่กับอะไร?
Mac

2
มันไม่ได้กำหนด behavior_only สำหรับ C_ เท่านั้น ถึงกระนั้นการพูดว่ามันขึ้นอยู่กับคอมไพเลอร์ก็ทำให้เข้าใจผิด - มันบอกเป็นนัยว่าคอมไพเลอร์ควรระบุพฤติกรรมนี้ ฉันกลับการลงคะแนนของฉัน แต่ให้พิจารณาแก้ไขคำตอบของคุณ - แก้ไข: อุ๊ปส์ฉันทำไม่ได้ - คุณต้องแก้ไขก่อน: D
Mr_and_Mrs_D

16

โครงสร้างอย่างx = x++;บ่งชี้ว่าคุณอาจเข้าใจผิดว่าตัว++ดำเนินการทำอะไร:

// original code
int x = 7;
x = x++;

ลองเขียนสิ่งนี้ใหม่เพื่อทำสิ่งเดียวกันโดยยึดการลบ++โอเปอเรเตอร์:

// behaves the same as the original code
int x = 7;
int tmp = x; // value of tmp here is 7
x = x + 1; // x temporarily equals 8 (this is the evaluation of ++)
x = tmp; // oops! we overwrote y with 7

ตอนนี้เรามาเขียนใหม่เพื่อทำ (สิ่งที่ฉันคิด) คุณต้องการ:

// original code
int x = 7;
x++;

ความละเอียดอ่อนที่นี่คือ++ผู้ประกอบการปรับเปลี่ยนตัวแปรxซึ่งแตกต่างจากการแสดงออกเช่นx + xซึ่งจะประเมินเป็นค่า int แต่ปล่อยให้ตัวแปรxตัวเองไม่เปลี่ยนแปลง พิจารณาการสร้างเช่นforห่วงที่เคารพ:

for(int i = 0; i < 10; i++)
{
    System.out.println(i);
}

สังเกตเห็นi++ในที่นั่น? มันเป็นผู้ประกอบการเดียวกัน เราสามารถเขียนforลูปนี้แบบนี้และมันจะทำตัวเหมือนเดิม:

for(int i = 0; i < 10; i = i + 1)
{
    System.out.println(i);
}

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


13

ตามรหัสไบต์ที่ได้รับจากไฟล์คลาส

ทั้งสองได้รับมอบหมายเพิ่มขึ้น x แต่ความแตกต่างคือช่วงเวลาของ when the value is pushed onto the stack

ในCase1Push เกิดขึ้น (จากนั้นกำหนดในภายหลัง) ก่อนการเพิ่ม (หมายถึงการเพิ่มขึ้นของคุณไม่ได้ทำอะไรเลย)

ในการCase2เพิ่มขึ้นเกิดขึ้นครั้งแรก (ทำให้เป็น 8) จากนั้นผลักลงบนสแต็ก (และจากนั้นกำหนดให้กับ x)

กรณีที่ 1:

int x=7;
x=x++;

รหัสไบต์:

0  bipush 7     //Push 7 onto  stack
2  istore_1 [x] //Pop  7 and store in x
3  iload_1  [x] //Push 7 onto stack
4  iinc 1 1 [x] //Increment x by 1 (x=8)
7  istore_1 [x] //Pop 7 and store in x
8  return       //x now has 7

กรณีที่ 2:

int x=7; 
x=++x;

รหัสไบต์

0  bipush 7     //Push 7 onto stack
2  istore_1 [x] //Pop 7 and store in x
3  iinc 1 1 [x] //Increment x by 1 (x=8)
6  iload_1  [x] //Push x onto stack
7  istore_1 [x] //Pop 8 and store in x
8  return       //x now has 8
  • สแต็คที่นี่หมายถึงตัวถูกดำเนินการท้องถิ่น: ดัชนี x: 1 ประเภท: int

คุณช่วยอธิบายคำตอบของคุณแบบละเอียดได้ไหม
Nihar

กรุณาดูที่ลิงค์และความคิดเห็นที่อ้างอิง
แม้เวลา

8

มันเพิ่มขึ้นหลังจาก " x = x++;" มันจะเป็น 8 ถ้าคุณทำ " x = ++x;"


4
ถ้ามันเพิ่มขึ้นหลังจากx = x++นั้นควรเป็น 8
R. Martinho Fernandes

8

ผู้ประกอบการโพสต์เพิ่มขึ้นทำงานดังนี้:

  1. เก็บค่าก่อนหน้าของตัวถูกดำเนินการ
  2. เพิ่มค่าของตัวถูกดำเนินการ
  3. ส่งคืนค่าก่อนหน้าของตัวถูกดำเนินการ

ดังนั้นคำสั่ง

int x = 7;
x = x++; 

จะถูกประเมินดังนี้:

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

ดังนั้น x จึงเพิ่มขึ้นแน่นอน แต่เนื่องจาก x ++ กำหนดผลลัพธ์กลับเป็น x ดังนั้นค่าของ x จะถูกแทนที่ด้วยค่าก่อนหน้า


แต่ใน msvc x คือ 8 ใช่ใน gcc และเสียงดังกราว x คือ 7
Summer Sun

7

การเพิ่มขึ้นเกิดขึ้นหลังจากที่ x ถูกเรียกดังนั้น x ยังคงเท่ากับ 7 ++ x จะเท่ากับ 8 เมื่อ x ถูกเรียก


7

เมื่อคุณกำหนดค่าใหม่สำหรับxมันยังคงเป็น 7 ลองx = ++xแล้วคุณจะได้ 8 อย่าง

x++; // don't re-assign, just increment
System.out.println(x); // prints 8

6

เนื่องจาก x ++ เพิ่มค่าหลังจากการกำหนดให้กับตัวแปร เป็นต้นและระหว่างการดำเนินการของบรรทัดนี้:

x++;

varialbe x จะยังคงมีค่าดั้งเดิม (7) แต่การใช้ x อีกครั้งในบรรทัดอื่นเช่น

System.out.println(x + "");

จะให้ 8

หากคุณต้องการใช้ค่าที่เพิ่มขึ้นของ x ในคำสั่งการมอบหมายให้ใช้

++x;

สิ่งนี้จะเพิ่ม x เป็น 1 จากนั้นกำหนดค่าให้กับตัวแปร x

[แก้ไข] แทน x = x ++ มันเป็นแค่ x ++; อดีตกำหนดค่าดั้งเดิมของ x ให้กับตัวเองดังนั้นจึงไม่ทำอะไรเลยในบรรทัดนั้น


หนึ่งที่บอกว่ามันเพิ่มขึ้นหลังจากที่ได้รับมอบหมายและคนที่บอกว่ามันจะพิมพ์ 8 มันเพิ่มขึ้นก่อนที่จะได้รับมอบหมายและมันพิมพ์ 7
R. Martinho Fernandes

ถ้า x เดิมเป็น 7, System.out.println (String.valueOf (x ++)); พิมพ์ 7. คุณแน่ใจหรือไม่ว่าเรากำลังพูดถึงภาษาการเขียนโปรแกรมเดียวกัน
josephus

ใช่ฉันเป็น ideone.com/kj2UUนี้ไม่ได้พิมพ์ 8 เช่นคำตอบนี้อ้างว่า
R. Martinho Fernandes

ใช่ฉันคิดผิด x = x ++ จะกำหนด 7 ถึง x ก่อนที่จะเพิ่ม x ในฐานะที่เป็น x ++ (ซึ่งเป็นการกำหนดในตัวเอง) จะแก้ไขก่อนที่ x = (อะไรก็ตาม) ค่าที่กำหนดให้กับ x ใน x = (อะไรก็ตาม) จะตามมา ขอโทษฉันไม่เห็นอย่างนั้น
josephus

1
ที่จริงแล้วการเพิ่มขึ้นเป็นสิ่งแรกที่เกิดขึ้น ideone.com/xOIDU
R. Martinho Fernandes

4

เกิดอะไรขึ้นเมื่อint x = 7; x = x++;?

ans -> x++หมายถึงค่าการใช้งานครั้งแรกของ x สำหรับนิพจน์แล้วเพิ่มขึ้นทีละ 1
นี่คือสิ่งที่เกิดขึ้นในกรณีของคุณ ค่าของ x บน RHS จะถูกคัดลอกไปยังตัวแปร x บน LHS แล้วค่าของxจะเพิ่มขึ้น 1

ในทำนองเดียวกัน++x หมายถึงการ ->เพิ่มค่าของ x ก่อนโดยหนึ่งแล้วใช้ในการแสดงออก
ดังนั้นในกรณีของคุณถ้าคุณทำ x = ++x ; // where x = 7
คุณจะได้รับค่า 8

เพื่อความชัดเจนยิ่งขึ้นลองดูว่าจะมีคำสั่ง printf จำนวนเท่าใดรันโค้ดต่อไปนี้

while(i++ <5)   
  printf("%d" , ++i);   // This might clear your concept upto  great extend

ไม่ถูกต้อง "ค่าของ x บน RHS ถูกคัดลอกไปยังตัวแปร x บน LHS แล้วค่าของ x จะเพิ่มขึ้น 1" - นี่จะทำให้xเป็น 8 แต่มันคือ 7 - การเพิ่มเกิดขึ้นระหว่างการอ่านและการมอบหมาย
user85421

3

++xคือ pre-increment ->x ถูกเพิ่มขึ้นก่อนที่จะใช้งาน
x++คือการเพิ่ม->ขึ้นภายหลัง x จะเพิ่มขึ้นหลังจากการใช้งาน

int x = 7; -> x get 7 value <br>
x = x++; -> x get x value AND only then x is incremented

1

ดังนั้นนี่หมายความว่า: x++ไม่เท่ากับx = x+1

เพราะ:

int x = 7; x = x++;
x is 7

int x = 7; x = x = x+1;
x is 8

และตอนนี้ดูเหมือนแปลกเล็กน้อย:

int x = 7; x = x+=1;
x is 8

คอมไพเลอร์ขึ้นอยู่มาก!


2
ใครบอกว่ามันเท่ากันในตอนแรก
fortran

1
ถ้าฉันเป็นคุณฉันจะทิ้งหนังสือเหล่านี้ทันที xD ไม่ว่าในกรณีใดมันจะเหมือนกับ(x = x + 1, x-1)ใน C ซึ่งอนุญาตให้ใช้การคั่นด้วยเครื่องหมายจุลภาค
fortran

3
@fortran: ในสำเนาทศวรรษของฉัน "ภาษา Java Programming, Third Edition" ในหน้า 159 มันบอกว่า "" นิพจน์ i ++ เทียบเท่ากับ i = i + 1 ยกเว้นว่าฉันได้รับการประเมินเพียงครั้งเดียว "ใครบอกว่า ในตอนแรก James Gosling จะปรากฏส่วนของข้อมูลจำเพาะ Java รุ่นนี้มีความคลุมเครือเป็นพิเศษและมีการระบุที่ไม่ดีฉันเชื่อว่ารุ่นต่อมาจะล้างข้อมูลภาษาเพื่อแสดงความหมายของผู้ให้บริการที่ชัดเจนยิ่งขึ้น
Eric Lippert

2
@fortran: โดย "ยกเว้น i ถูกประเมินเพียงครั้งเดียว" มาตรฐานพยายามที่จะถ่ายทอดว่านิพจน์เช่น "M (). x ++" เท่านั้นเรียก M () ครั้งเดียว ถ้อยคำที่คลุมเครือและมีความแม่นยำน้อยกว่าจะเน้นว่ามีความแตกต่างระหว่างการประเมิน i เป็นตัวแปรเพื่อกำหนดตำแหน่งที่เก็บ - ซึ่งเป็นความหมายโดย "ประเมินเพียงครั้งเดียว" ที่นี่ - และการอ่านหรือเขียนไปยังที่เก็บข้อมูลนั้น - - สิ่งใดสิ่งหนึ่งอาจเป็นการตีความที่สมเหตุสมผล แต่ไม่ถูกต้องของ 'ประเมิน' เห็นได้ชัดว่าที่เก็บต้องมีทั้งอ่านและเขียน!
Eric Lippert

1
"ขึ้นอยู่กับผู้รวบรวม" - ไม่เลย!
Stephen C

-1

x = x ++;

นี่คือตัวดำเนินการที่เพิ่มขึ้นภายหลัง ควรเข้าใจว่าเป็น "ใช้ค่าของตัวถูกดำเนินการแล้วเพิ่มตัวถูกดำเนินการ"

หากคุณต้องการให้สิ่งที่ตรงกันข้ามเกิดขึ้นเช่น "เพิ่มตัวถูกดำเนินการแล้วใช้ค่าของตัวถูกดำเนินการ" คุณต้องใช้ตัวดำเนินการเพิ่มล่วงหน้าดังที่แสดงด้านล่าง

x = ++ x;

โอเปอเรเตอร์นี้จะเพิ่มค่าของ x เป็น 1 ก่อนจากนั้นจึงกำหนดค่ากลับเป็น x


-1

ฉันคิดว่าความขัดแย้งนี้สามารถแก้ไขได้โดยไม่ต้องใช้รหัสและแค่คิด

พิจารณา i ++ & ++ i เป็นฟังก์ชันพูด Func1 & Func2

ตอนนี้ฉัน = 7;
Func1 (i ++) ส่งคืน 7, Func2 (++ i) ส่งคืน 8 (ทุกคนรู้สิ่งนี้) ภายในทั้งสองฟังก์ชั่นเพิ่มขึ้น i ถึง 8 แต่พวกเขากลับค่าที่แตกต่าง

ดังนั้นฉัน = i ++ เรียกฟังก์ชัน Func1 ภายในฟังก์ชัน i เพิ่มขึ้นเป็น 8 แต่เมื่อทำเสร็จแล้วฟังก์ชันจะคืนค่า 7

ดังนั้นในที่สุด 7 ได้รับการจัดสรรให้ฉัน (ดังนั้นในที่สุด i = 7)


2
ไม่มี "การโต้เถียง" ที่ถูกต้องที่นี่ รหัสแสดงพฤติกรรมในลักษณะเฉพาะและพฤติกรรมสอดคล้องกับ JLS ใครก็ตามที่คิดว่ามันมีพฤติกรรมแตกต่างกันก็ไม่ได้ลองหรือพวกเขาจะถูกหลอกลวง (นี่เป็นบิตเช่นบอกว่า 7 x 7 เป็น 49 คือ "ความขัดแย้ง" เมื่อมีคนมีตารางเวลาของพวกเขาลืม ... )
สตีเฟ่น C

-2

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

x = x++;

สิ่งที่เกิดขึ้นคือคุณกำลังกำหนดค่าของ x เป็น x x ++ เพิ่มขึ้น x หลังจากค่าของ x ถูกกำหนดให้กับ x นั่นคือการทำงานของผู้ให้บริการหลังการเพิ่ม มันทำงานได้หลังจากมีการดำเนินการคำสั่ง ดังนั้นในรหัสของคุณ x จะถูกส่งกลับก่อนหลังจากนั้นจะเพิ่มขึ้นทีหลัง

ถ้าคุณทำ

x = ++x;

คำตอบคือ 8 เพราะคุณใช้โอเปอเรเตอร์ที่เพิ่มขึ้นล่วงหน้า ค่านี้จะเพิ่มค่าก่อนที่จะส่งคืนค่าของ x

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