C++ while(*s1++ = *s2++) 与 while(*s1++ == *s2++)

while(*s1++ = *s2++)

一道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++) 与 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”

上一篇:【Java】 子字符串的比较(substring的==与equal()使用)


下一篇:Java版图形界面计算器