注册 登录
编程论坛 C++教室

很小的问题,大家帮忙看看

xishui777 发布于 2011-01-05 21:35, 888 次点击
#include<iostream>
using namespace std;
int main()
{
    int a=5;
    float b=3.1;
    double c=3.141592;
    char e='k';
    cout<<"a= "<<a<<"   地址: "<<&a<<endl;
    cout<<"b= "<<b<<"   地址: "<<&b<<endl;
    cout<<"c= "<<c<<"   地址: "<<&c<<endl;
    cout<<"e= "<<e<<"   地址: "<<&e<<endl;
    system("pause");
    return 0;
}
为什么e的地址是乱码。我用的vc6.0
int j=5,p;
p=(++j)+(++j)+(++j);
p=6+7+8=21才对呀。
为什么运行结果确等于22?
10 回复
#2
qq10235692232011-01-05 23:15
我运行了一下,确实和楼主说的情况一样。我也不知道是什么原因,真是奇怪了。
#3
pangding2011-01-05 23:25
因为 e 的地址是 char *,重载去输出字符串了。但那个地方除了第一个是 k 以外,其它的都是乱码。
其它的指针因为没有特别的重载,用的都是类似 void * 的处理办法。
#4
pangding2011-01-05 23:25
第二个问题没有什么特别的意义,那个結果和编译器有关。
#5
点线面2011-01-05 23:36
#include<iostream>
#include<stdio.h>

using namespace std;
int main()
{
    int a=5;
    float b=3.1;
    double c=3.141592;
    char e='k';
    char *ee=&e;
    printf("e= %c   地址:%X\n",e,&e);
    cout<<"a= "<<a<<"   地址: "<<&a<<endl;
    cout<<"b= "<<b<<"   地址: "<<&b<<endl;
    cout<<"c= "<<c<<"   地址: "<<&c<<endl;

    system("pause");
    return 0;
}
#6
bjl20102011-01-06 09:05
只有本站会员才能查看附件,请 登录
怎么会是乱码?
#7
Young222011-01-06 11:10
ls没加&符吧
#8
八画小子2011-01-07 02:20
回复 3楼 pangding
稍稍说明一下,e='k','k'是一个字符常量,而不是字符串,这两个之间有很大的区别。cout被重载可以显示多种类型的值,在这个地方,e其本质是一个地址,即存储'k'常量的地址。
语句
    char e = 'abc';
    cout << e;
在这里cout接受的参数类型时char *的,也就是说传递的是字符串'abc'的地址。
语句
    char e = 'k';
    cout << e;
在这里,同样,cout接受的参数类型时char *的,即字符常量'k'的地址。
如果显示字符串或字符常量的地址,应该在e前面加上(int *)
#9
pangding2011-01-08 01:07
习惯上如果要输出地址,一般是转成 void *。

我想你说的这些楼主都懂,他只是一时没想明白为什么。
#10
八画小子2011-01-08 01:31
回复 9楼 pangding
既然都已经懂了,怎么还一时不明白呢?楼主若是知道,那也只能是只知其然而不知其所以然。这就是对最基本知识没有吃透的结果,也是现在很多学习编写程序的人的通病:急于求成,但却欲速则不达。
#11
pangding2011-01-08 02:04
很正常。要是会的东西都能一眼看出来,那我主观的估计一下,软件的 BUG 就能减少 60%。

把 ; 写成 , ;把 == 写成 =。还花巨资调试几个月的人都是深暗其道的,还不是照样犯这些错误。犯了就犯了,瞪着眼还看不出来。

错误混杂在代码里是很难发现的。
楼主那个 int double 啥的都没问题,就到 char 那不行了,初学者没想到很正常吧。我也不能一瞬间看出问题所在,只是知道結果了,反推一下原因就很简单而已。直接让我说結果肯定不会想到那里会乱码的。最多是自己写码的时候会习惯性的在输出地址前加个 (void *)。
1