如:
CString test="a";
if(test==NULL)AfxMessageBox("ee");
为什么CString 类不能与NULL,false,0相比较呢?编译通过,但是执行出现错误!
请教下高手深入讲解下!
类似:char aa='a';
if(aa==NULL)AfxMessageBox("ee");
却能良好的运行!!

解决方案 »

  1.   

    CString m_str;
    m_str.IsEmpty()
      

  2.   

    正常情况下,指针类型与NULL比较,布尔类型与TRUE, FALSE比较。
      

  3.   

    这样也可以:
    CString test="a";
    if(test==" ")AfxMessageBox("ee");
      

  4.   

    CString test="a"; 
    test 是一个类的对象,是一个结构 ……char aa='a';
    aa 是一个变量,里面存放的是一个数值 ……NULL是一个宏,#define NULL ((void *)0),也是一个数值 ……所以,aa可以与NULL比,test不可以 ……
      

  5.   

    lmxmx有道理,象这种问题建议您先按规定记住(确实简单),然后再慢慢去体会
      

  6.   

    NULL is the null-pointer value used with many pointer operations and functions.NULL是空指针的值那什么是空指针呢?  在一个对象指针创建而没有进行初始化,其即为空. 初始化的过程系统会为它分配一个指针地址, 当它已得到一个分配的指针地址后即不为空.而LZ的
    CString test="a"; 其实已经对test这个CString类型的对象进行了初始化, 那么它就已经分配到了一个十六进制的内存地址,也就是一个不为0的地址.其实LZ可以看一下NULL宏的定义
    #define NULL    0
    其实它从某种程度上与0是等效的LZ的意思应该是想要检测其是否为空吧?那只要
    if(test=="")
       AfxMessageBox("ee");那为什么char aa='a'; 
    if(aa==NULL)AfxMessageBox("ee"); 
    可行呢?其实char型变量实际上对应的也是一个数值,比如a对应于97,A对应于65,从上面可以知道NULL有个#define NULL 0的定义,都是数值型的比较不会有错吧?

    CString test="a"; 
    if(test==NULL)AfxMessageBox("ee");
    中的test显然是一个对象(一个类的实例化后生成的一个实体)
    比方说, struct从某个程度上也可以有类的功能,如果你把这个test换成结构体后, 看下会不会是同样的结果呢?
    ==的一边是一个结构,一边是一个数值,执行能不出错吗? 说多了可能把你搞乱了,不好意思...  其实你这样子试试
    CString test="a"; 
    if(&test==NULL)AfxMessageBox("ee");是不是不会出错? 呵呵,  多了个& .  希望能帮助你理解
      

  7.   

    这个可以运行,楼上的已经解释过了,咱也同意
    关于这个,编译时可以通过,那是因为CString类定义了BOOL operator ==( const CString& s1, LPCTSTR s2 );这个重载函数,而NULL定义为(void *)0,再加上VC6对C++标准的支持不高,可能将void *转换成了LPCTSTR了吧(都是指针类型),所以编译通过,但运行时,由于void *毕竟不是LPCTSTR,在比较的时候肯定要出错的。楼主可以用VS2008编译下,肯定通不过的。
    想要通过,也就是楼主想要CString和NULL比较的话,那就得自己写BOOL operator ==( const CString& s1, void * s2);这样一个函数,可实现如下:
    BOOL operator ==( const CString& s1, void * s2)
    {
        if(s1.IsEmpty())
           return TRUE;
        else
           return FALSE;
    }
    我们可以看到,其实第2个参数没用到,那就说明test==NULL这样的比较式无意义的,应该这样比
    test==""
    建议楼主补补C+++的基础知识,会写出这样的代码,表示楼主的C++的基本功还不够。
    要知道,任何一个类,所有的操作符(除.和->),像+,-,==,!=这些,都是不能直接使用的,因为你自定义的类,不是系统默认的类型,你要比较CString和NULL,我们知道,是要比较字符串是否为空,但系统怎么知道怎么比,是比长度,比大小,还是比什么?所以如果要比的话,就必须自己去写比较函数,告诉系统怎么去比较。
      

  8.   

    你应该可以看出,char是单字节,而你的CString却不是单字节,而是字符串。但是CString有字符串重载,是调用strcmp进行比较的(应该是这样),但是NULL却指向0x00000000,这是系统禁读区域,如果读取,必崩溃无疑。你可以使用
    char* a="a";
    strcmp(a,NULL);
    测试一下(C语言,C++用API lstrcmp)
      

  9.   

    另外,字符数组的比较必须使用lstrcmp,绝不能使用==,除非你想用循环。和NULL比,你是想比大小,想比内容,想比长度,想比地址,还是想比什么?CString是一个类,而NULL是0,你是想比地址?&a==0
    想比大小、长度?sizeof a==0
    想比内容?把0换成"0"再比所以说,你和0比怎么看都不是一个好的程序。
      

  10.   

    如: 
    CString test="a"; 
    if(test==NULL)AfxMessageBox("ee"); 
    改成
    如: 
    CString test="a"; 
    if(test.lockbuffer()==NULL)AfxMessageBox("ee"); 
      

  11.   

    CString的==是因为重载了运算符,跟一下CString类的源代码就知道为啥不能用NULL了
      

  12.   

    CString是一个类  并不是简单的变量类型你可以转换成缓冲区的字符串   再和NULL比较搜索CString转char *
      

  13.   

    我经常这样用 :CString test=_T("a"); 
    if(test==_T(""))AfxMessageBox("ee"); 运行正确的很!呵呵
      

  14.   

    你要比较也要和""比较,NULL是什么?0或(VOID*)0,在CSTRING的一元操作符==中,没有对NULL的处理,因为CSTRING最短是长度为0的字符串,根本没有NULL的时候。CHAR当然可以和NULL比较了,他不能和0比较吗?!