สมมติว่าฉันต้องการเขียนฟังก์ชันที่เชื่อมสองสายเข้าด้วยกันใน C วิธีที่ฉันจะเขียนคือ:
void concat(char s[], char t[]){
int i = 0;
int j = 0;
while (s[i] != '\0'){
i++;
}
while (t[j] != '\0'){
s[i] = t[j];
i++;
j++;
}
s[i] = '\0';
}
อย่างไรก็ตามK&Rในหนังสือของพวกเขามีการใช้งานที่แตกต่างกันโดยเฉพาะอย่างยิ่งรวมถึงสภาพของลูปในขณะที่มากที่สุด:
void concat(char s[], char t[]){
int i, j;
i = j = 0;
while (s[i] != '\0') i++;
while ((s[i++]=t[j++]) != '\0');
}
วิธีไหนเป็นที่ต้องการ มันเป็นกำลังใจหรือหมดกำลังใจที่จะเขียนโค้ดในลักษณะที่ K&R ทำหรือไม่? ฉันเชื่อว่าคนอื่นจะอ่านเวอร์ชันของฉันได้ง่ายขึ้น
while (*s++ = *t++);
(ฉัน C เป็นสนิมมากฉันต้องมี parens สำหรับการเป็นผู้ดำเนินการหรือไม่) K&R ปล่อยหนังสือเวอร์ชั่นใหม่ของพวกเขาหรือไม่ หนังสือต้นฉบับของพวกเขามีรหัสที่รัดกุมและสำนวนอย่างมาก
'\0'
จากt
( while
ออกก่อน) สิ่งนี้จะทำให้s
สตริงที่เกิดขึ้นโดยไม่มีการยุติ'\0'
(เว้นแต่ว่าตำแหน่งหน่วยความจำนั้นเป็นศูนย์อยู่แล้ว) บล็อกรหัสที่สองจะทำสำเนาของการยกเลิก'\0'
ก่อนที่จะออกจากwhile
วง