C++ while(*p)与while(p)的区别

测试用的是2019.02Clion编辑器

简要回答

while(*p)指的是当p指向的数值不为0,或者不为’\0’时执行操作。相当于while(*p!=0||*p!=’\0’)
while( p)指的是当p存在指向时执行操作。(这个是根据结果推测的结论,分析过程和测试代码如下,如有不对,还望指正!)

测试代码

#include 

using namespace std;

char a[6]="a\0p0l",*p;

int main() {
    p=a;
    cout<<"while(*p): ";
    while(*p){
        cout<<*p++<<'\t';
    }
    cout<<"while(p): ";
    p=a;
//    while(p){
//        cout<<*p++<<'\t';
//    }
//会出现不断循环的情况,为保证安全,用下面这种方法限制输出
    for(int i=0;i<10;i++){
        if(p){
            cout<<*p++<<'\t';
        }
    }
    
    return 0;
}

输出:

while(*p): a    while(p): a             p       0       l

分析:

  1. *p遇到’\0’后跳出了循环,但p没有,并且在这种情况下,if( p)仍判断为真,因为从a与p的间隔可以看出是两个’\t’。
  2. p遇到0的时候,if( p)依然判断为真
  3. 若不控制输出,使用while( p),会发现进入无限循环,说明while( p)一直判断为真
  4. *p遇到0时经测试也会停止

对于整型数组:

int a[6]={1,6,2,3,4,5},*p;

int main() {
    p=a;
    cout<<"if(*p): ";
//    while(*p){
//        cout<<*p++<<'\t';
//    }
    for(int i=0;i<10;i++){
        if(*p){
            cout<<*p++<<'\t';
        }
    }
    p=a;
    cout<<"if(p): ";
//    while(p){
//        cout<<*p++<<'\t';
//    }
    for(int i=0;i<10;i++){
        if(p){
            cout<<*p++<<'\t';
        }
    }
    return 0;
}

输出:

if(*p): 1       6       2       3       4       5       if(p): 1        6       2       3       4       5       0
0       4206120 0

分析:

  1. 虽然整型数组结尾没有’\0’结束符,但是*p依然会终止。p也依然会越界。
  2. 经测试,*p遇到0也会终止,p依然不会。

小总结

在使用指针遍历数组时,用while(*p)会比while( p)安全很多。虽然不知道为什么无论怎样while( p)都会越界,也有可能不同编辑器会有不同结果?本人知识水平有限,不能很好地解释其中原因。如果哪位大神知道的希望可以告诉我hhhh,还有如果文章有哪里不对的,也希望大家能够批评指正,毕竟我也只是一只小白,还需要多多改进。

你可能感兴趣的:(C++,c++)