ฉันต้องการเพิ่มตัวแปรสองตัวในfor
เงื่อนไข -loop แทนที่จะเป็นตัวแปรเดียว
สิ่งที่ชอบ:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
ไวยากรณ์ของสิ่งนี้คืออะไร?
ฉันต้องการเพิ่มตัวแปรสองตัวในfor
เงื่อนไข -loop แทนที่จะเป็นตัวแปรเดียว
สิ่งที่ชอบ:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
ไวยากรณ์ของสิ่งนี้คืออะไร?
คำตอบ:
สำนวนทั่วไปคือการใช้ตัวดำเนินการลูกน้ำซึ่งประเมินทั้งตัวถูกดำเนินการและส่งกลับตัวถูกดำเนินการที่สอง ดังนั้น:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
ตอนนี้ได้เขียนไปแล้วผู้แสดงความคิดเห็นแนะนำว่าจริง ๆ แล้วมันเป็นน้ำตาลวากยสัมพันธ์พิเศษบางอย่างในคำสั่ง for ไม่ใช่ตัวดำเนินการลูกน้ำเลย ฉันตรวจสอบใน GCC ดังนี้:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
ฉันคาดหวังว่า x จะรับค่าดั้งเดิมของ a ดังนั้นมันควรจะแสดง 5,6,7 .. สำหรับ x สิ่งที่ฉันได้คือสิ่งนี้
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
อย่างไรก็ตามถ้าฉันยึดนิพจน์เพื่อบังคับให้ parser เห็นตัวดำเนินการลูกน้ำจริงๆฉันจะได้สิ่งนี้
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
ในตอนแรกฉันคิดว่าสิ่งนี้แสดงให้เห็นว่ามันไม่ได้ทำงานเป็นตัวดำเนินการลูกน้ำเลย แต่ปรากฎว่านี่เป็นเพียงปัญหาลำดับความสำคัญ - ตัวดำเนินการลูกน้ำมีลำดับความสำคัญต่ำที่สุดเท่าที่จะเป็นไปได้ดังนั้นนิพจน์ x = i ++, a ++ จึงมีประสิทธิภาพ แยกวิเคราะห์เป็น (x = i ++), a ++
ขอบคุณสำหรับความคิดเห็นทั้งหมดมันเป็นประสบการณ์การเรียนรู้ที่น่าสนใจและฉันใช้ C มาหลายปีแล้ว!
ลองทำตามนี้
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
วงเล็บเสริมหลอกให้คอมไพเลอร์คิดว่าไม่ใช่การดำเนินการ "เพิ่ม" อีกต่อไป
พยายามอย่าทำ!
จากhttp://www.research.att.com/~bs/JSF-AV-rules.pdf :
กฎ AV 199
นิพจน์ส่วนเพิ่มใน for loop จะไม่ดำเนินการใด ๆ นอกจากเปลี่ยนพารามิเตอร์ single loop เป็นค่าถัดไปสำหรับลูปเหตุผล: ความสามารถในการอ่าน
for (int i = 0; i != 5; ++i, ++j)
do_something(i, j);
ฉันมาที่นี่เพื่อเตือนตัวเองถึงวิธีการเขียนโค้ดดัชนีที่สองลงในประโยคการเพิ่มของ FOR ลูปซึ่งฉันรู้ว่าสามารถทำได้โดยหลักจากการสังเกตในตัวอย่างที่ฉันรวมเข้ากับโปรเจ็กต์อื่นซึ่งเขียนด้วย C ++
วันนี้ฉันทำงานใน C # แต่ฉันรู้สึกมั่นใจว่าจะต้องปฏิบัติตามกฎเดียวกันในเรื่องนี้เนื่องจากคำสั่ง FOR เป็นโครงสร้างควบคุมที่เก่าแก่ที่สุดในการเขียนโปรแกรมทั้งหมด โชคดีที่ฉันเพิ่งใช้เวลาหลายวันในการบันทึกพฤติกรรมของ FOR loop ในโปรแกรม C รุ่นเก่าของฉันอย่างแม่นยำและฉันก็รู้ได้อย่างรวดเร็วว่าการศึกษาเหล่านั้นมีบทเรียนที่ใช้กับปัญหา C # ในปัจจุบันโดยเฉพาะกับพฤติกรรมของตัวแปรดัชนีที่สอง .
สำหรับผู้ที่ไม่ระมัดระวังต่อไปนี้เป็นบทสรุปของการสังเกตของฉัน ทุกสิ่งที่ฉันเห็นเกิดขึ้นในวันนี้โดยการสังเกตตัวแปรในหน้าต่าง Locals อย่างรอบคอบยืนยันความคาดหวังของฉันว่าคำสั่ง C # FOR ทำงานเหมือนกับคำสั่ง C หรือ C ++ FOR
หากตัวแปรดัชนีตัวใดตัวหนึ่งของคุณยังคงอยู่ในขอบเขตเมื่อการวนรอบสิ้นสุดลงค่าของตัวแปรจะสูงกว่าเกณฑ์ที่หยุดการวนซ้ำในกรณีของตัวแปรดัชนีจริง ในทำนองเดียวกันหากตัวแปรที่สองเริ่มต้นเป็นศูนย์ก่อนที่จะป้อนลูปค่าของมันในตอนท้ายจะเป็นการนับการวนซ้ำโดยสมมติว่าเป็นการเพิ่มขึ้น (++) ไม่ใช่การลดลงและไม่มีอะไรอยู่ใน เนื้อหาของลูปเปลี่ยนค่า
ฉันเห็นด้วยกับ squelart การเพิ่มตัวแปรสองตัวมีแนวโน้มที่จะเกิดข้อผิดพลาดโดยเฉพาะอย่างยิ่งหากคุณทดสอบเพียงตัวแปรเดียว
นี่เป็นวิธีที่อ่านได้ในการดำเนินการนี้:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
ลูปมีไว้สำหรับกรณีที่ลูปของคุณทำงานบนตัวแปรเพิ่ม / ลดหนึ่งตัวแปร สำหรับตัวแปรอื่น ๆ ให้เปลี่ยนในลูป
หากคุณต้องการj
ที่จะเชื่อมโยงไปi
ทำไมไม่ออกจากตัวแปรเดิมที่เป็นอยู่และเพิ่มi
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
ถ้าตรรกะของคุณซับซ้อนกว่านี้ (เช่นคุณต้องมอนิเตอร์มากกว่าหนึ่งตัวแปรจริงๆ) ฉันจะใช้while
ลูป
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
และเชื่อมa
ต่อกับลูป?
ใช้คณิตศาสตร์ หากการดำเนินการทั้งสองทางคณิตศาสตร์ขึ้นอยู่กับการวนซ้ำแบบวนซ้ำทำไมไม่คำนวณทางคณิตศาสตร์
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
หรือโดยเฉพาะอย่างยิ่งอ้างถึงตัวอย่างของ OP:
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
โดยเฉพาะอย่างยิ่งถ้าคุณส่งผ่านฟังก์ชันตามค่าคุณควรได้รับสิ่งที่ตรงตามที่คุณต้องการ