一道C++题目:
请选择以下程序的运行结果 ( )
#include<stdio.h> int main() { char str1[] = "India"; char str2[] = "BIX"; char *s1 = str1, *s2=str2; while(*s1++ = *s2++) printf("%s", str1); printf("\n"); return 0; }
A.IndiaBIX
B.BndiaBIdiaBIXia
C.India
D.(null)
这里考察的是C++的指针,程序中一共有两个指针:*s1 以及 *s2
首先,这两个指针初始状态下分别指向两个字符串str1以及str2。但是在执行:
while(*s1++ = *s2++)
的时候指针指向的位置发生了变化。赋值表达式的值等于被赋给s1的那个字符的ASCII码值,这一点很重要。虽然++的优先级高于*,但由于++放在指针变量的后面,所以先执行赋值表达式,然后指针变量自增。
所以当程序第一次进入while循环时,算法首先执行的是将指针s1指向s2的开头。所以此时指针*s1开头第一个字符不再是str1中的首字母I而是str2中的B,因此打印函数
printf("%s", str1);
得到的结果为:
Bndia
同时,当s2指向的空间有字符时,将其传递给当前s1指向的空间,赋值表达式的值不为0(非零即真),while循环不停止,当s2指向字符串结束符‘\0’并赋给时s1所指空间时,赋值表达式的值为0,while循环停止,字符串完成了复制。
所以执行第二次循环,根据s1++以及s2++将指针s1中的第二项指向s2的第二项,得到:
BIdia
以及第三次循环:
BIXia
所以最后打印结果为:
BndiaBIdiaBIXia
while(*s1++ = *s2++) 与 while(*s1++ == *s2++)虽然只相差了一个“=”,但是差别还是比较大的。
对于上面这个程序将“=”修改为“==”后再次运行:
#include<stdio.h> int main() { char str1[] = "India"; char str2[] = "BIX"; char *s1 = str1, *s2=str2; while(*s1++ == *s2++) printf("%s", str1); printf("\n"); return 0; }
程序输出为:
(null)
这里是由于“==”为比较运算符,程序执行时比较每一个字符串之间是否相等,这里while循环第一次比较的是两个字符串首字母是否相同,也就是"India"与"BIX"。显然它们是不同的,所以while循环的值为0。跳出循环。
若修改两个字符串为:“abIndia"与"abBIX”,重新运行上述程序:
#include<stdio.h> int main() { char str1[] = "abIndia"; char str2[] = "abBIX"; char *s1 = str1, *s2=str2; while(*s1++ == *s2++) printf("%s", str1); printf("\n"); return 0; }
此时由于字符串前两个字符相同,while循环执行两次,第三次跳出循环。所以最后的输出为:
abIndiaabIndia
即重复打印两次字符串 “abIndia”