关于C++的一道题
2013-11-06 12:51
302 查看
阅读下面程序,然后请写出输出结果:
输出结果如下图:
分析:为什么会这样的结果呢?首先我们先分析一下程序,首先我们先看看第一组a和b,那么a和b是什么呢?根据我们所学,我们知道a和b是数组的首地址,那么这个表达式(a==b)结果必然是不相等的,所以表达式的结果为0.然后我们再看一下第三组,前面多了个const限定符,const限定符只是在编译阶段编译器检查是否程序中有修改其变量的行为,当然我们可以通过一些手段来骗过编译器,来达到修改其值,不过这里有没有const和输出结果无关,与第一组a和b是一样的,因为e和f都是数组首地址,所以表达式(e==f)结果也必然为0.那么我们关注一下第二组和第四组,这里定义的c和d以及g和h都是字符串指针,按道理来说他们的地址应该不相等,为什么(c==d)和(g==h)的表达式为1呢?原因就是编译器过于聪明,字符串“123”在内存中只保留了一份,所以指针指向的是同一地址,那么自然的地址也相同,必然输出1。
为了验证所分析的理论成立,我们需要实践,反汇编看看,如下图:
#include <iostream> using namespace std; int main() { char a[]="123"; char b[]="123"; char *c="123"; char *d="123"; const char e[]="123"; const char f[]="123"; const char *g="123"; const char *h="123"; cout<<(a==b)<<" "<<(c==d)<<" "<<(e==f)<<" "<<(g==h)<<endl; return 0; }
输出结果如下图:
分析:为什么会这样的结果呢?首先我们先分析一下程序,首先我们先看看第一组a和b,那么a和b是什么呢?根据我们所学,我们知道a和b是数组的首地址,那么这个表达式(a==b)结果必然是不相等的,所以表达式的结果为0.然后我们再看一下第三组,前面多了个const限定符,const限定符只是在编译阶段编译器检查是否程序中有修改其变量的行为,当然我们可以通过一些手段来骗过编译器,来达到修改其值,不过这里有没有const和输出结果无关,与第一组a和b是一样的,因为e和f都是数组首地址,所以表达式(e==f)结果也必然为0.那么我们关注一下第二组和第四组,这里定义的c和d以及g和h都是字符串指针,按道理来说他们的地址应该不相等,为什么(c==d)和(g==h)的表达式为1呢?原因就是编译器过于聪明,字符串“123”在内存中只保留了一份,所以指针指向的是同一地址,那么自然的地址也相同,必然输出1。
为了验证所分析的理论成立,我们需要实践,反汇编看看,如下图:
相关文章推荐
- c++基础3:关于前置++和后置++的那么点纠结
- C++中关于流的概念
- 关于C++头文件的问题
- 关于c++名字解析的一个问题:名字空间污染
- 关于c++中继承和虚函数的一些思考
- C++中关于文件操作的函数
- C++中关于头文件<string>、<string.h>和<cstring>的区别
- 关于错误 Unhandled exception in (KERNEL32.DLL):0xE06D7363:Microsoft C++ Exce vc and access insert 记录
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- 关于thinking in c++
- 将类成员函数作为线程入口函数——关于C++ 类静态成员的学习
- C++中关于函数的引用
- c++ 中关于没有默认构造函数的成员类对象问题
- 漫漫编程路——C++篇(六)——关于继承
- 关于C++中的域作用符
- 关于C++中的前置声明
- 关于C/C++中的点操作符和箭头操作符
- 关于容易被忽略的C++特性
- 有个问题,是关于C++文本输入输出的