工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2849|回复: 22

i不用赋值也可以用吗?

[复制链接]
发表于 2007-5-21 22:28 | 显示全部楼层 |阅读模式
今晚在做数据结构的题时发现了一个很奇怪的现象:做返回逆波兰式那道题的时候...(下面是简化版)
.....
char *e,*p;
while(*e!='\0')
{*p++=*e;
}
*p='\0';
.....
return p;....
但是上机运行是什么不输出...
而以下就可以:
char *e,*p;int i;(注意了i是不赋初值的!)
while(*e!='\0')
{*(p+i)=*e;i++;
}
*(p+i)='\0';
....
return p;....
我茫然....将i随便赋初值后居然还是没东西输出,不赋初值才正确!
我很晕... 希望高手指点.....
发表于 2007-5-21 23:34 | 显示全部楼层
int是基本的数据类型;
其它基本的数据类型还有:
boolean
char
byte
short
int
long
float
double
基本数据类型缺省值与它们的类型有关。
int缺省值是0
回复

使用道具 举报

发表于 2007-5-21 23:45 | 显示全部楼层
原帖由 Freedomer 于 2007-5-21 22:28 发表
char *e,*p;int i;(注意了i是不赋初值的!)
while(*e!='\0') ...


不清楚问题出在哪,但楼主可以在红色字体即while前输出i的值看看。


PS:楼上没看帖直接回?一个说C,一个说 java
回复

使用道具 举报

发表于 2007-5-22 02:23 | 显示全部楼层
LZ可以把整个这个函数的代码贴出来么?
回复

使用道具 举报

发表于 2007-5-22 09:09 | 显示全部楼层
数据结构作业系统里的”类C语言“是会像C++那样对变量赋初始值的


PS:楼主表达的不是很清楚,看不明白你想说什么……
而且和赋不赋初始值应该没有关系,我写的赋了初值,但没问题……

[ 本帖最后由 iptton 于 2007-5-22 09:13 编辑 ]
回复

使用道具 举报

发表于 2007-5-22 09:15 | 显示全部楼层

  1. while(*e!='\0'){
  2.     *(p+i)=*e;i++;
  3. }
复制代码

这句的结束语句有些莫名其妙,e没有变过?还是还有其它代码?
建议楼主把代码帖上来,最好把部分实现细节用伪码或注释替换
回复

使用道具 举报

 楼主| 发表于 2007-5-22 23:29 | 显示全部楼层
原来不赋值和赋0都是正确的,其他值就不对;
是不是用了p=(char*)malloc(strlen(e)*sizeof(char));这个语句。能不能解释一下,上面那语句,p是指向什么?可以用p++吗?
或者简单一点,我要实现一个复制的函数
char *copy(char *e)
{while(*e!='\0')
  {*p++=*e++;
   }
  *p='\0';
return p;
}
这样可以吗?
回复

使用道具 举报

发表于 2007-5-22 23:51 | 显示全部楼层
原帖由 hexq 于 2007-5-21 23:34 发表
int是基本的数据类型;
其它基本的数据类型还有:
boolean
char
byte
short
int
long
float
double
基本数据类型缺省值与它们的类型有关。
int缺省值是0


胡说。。。
你自己试试,看是不是缺省为0。。。

#include <stdio.h>
int main(){         
          int i;
          printf("%d\n",i);
          return 0;
}
回复

使用道具 举报

发表于 2007-5-23 00:17 | 显示全部楼层
while(*e!='\0')
会执行吗?会的话,会死循环吗?

char *e,*p;int i;(注意了i是不赋初值的!)
while(*e!='\0')
{*(p+i)=*e;i++;
}
*(p+i)='\0';
....
return p;....


i不赋初值的话,i是个很大的负数吧。。*(p+i) 都不知道指向哪里。。

所以不会改变*(p+0),也就是*p的值

同自加加的那道程序相比,p指向的地址压根就没变过。。


[ 本帖最后由 brilon 于 2007-5-23 00:24 编辑 ]
回复

使用道具 举报

发表于 2007-5-23 21:33 | 显示全部楼层
最近运算符的运算优先级不是很清晰的就用()把它括起来...
回复

使用道具 举报

发表于 2007-5-23 21:37 | 显示全部楼层
无论何时,只要不想自己的程序失控就不能不赋初值就使用....
而且如果有多个运算符的一起的话最好用括号括起来表示自己要表示的运算....
回复

使用道具 举报

发表于 2007-5-23 21:40 | 显示全部楼层
原来我弄错了。。。C++中不会自动初始化……在C++中,变量是会自动初始化的,在C中变量不初始化它的值是个未知数,分配到的空间原本是什么数据就什么数据,不一定是 很小的负数……

  1. char *copy(char *e)
  2. {
  3.   while(*e!='\0')
  4.   {
  5.       *p++=*e++;
  6.    }
  7.   *p='\0';
  8.   return p;
  9. }
复制代码

即然p 是在外面声明的变量,申请的空间,还 return 什么...
LZ无视了我们要求帖全代码的要求,
没有足够的信息我们也无法判断哪里出错……
这么多回帖了都没有一点讨论结果

PS:编码的风格不敢恭维……对教材里的 {后直接写代码的“风格”非常厌恶。。

[ 本帖最后由 iptton 于 2007-5-24 00:34 编辑 ]
回复

使用道具 举报

发表于 2007-5-23 21:44 | 显示全部楼层
欣赏LS的写的..赞一下...
回复

使用道具 举报

发表于 2007-5-23 21:48 | 显示全部楼层
char *e,*p;
while(*e!='\0')
{
*p++=*e;
}
*p='\0';
.....
return p;....

到这里p是不是已经指向字符串的末尾了?......
返回这个p有什么意义....
回复

使用道具 举报

 楼主| 发表于 2007-5-23 21:54 | 显示全部楼层
看来想简化一点都不行...
char *copy(char *e){
char*p;
p=(char*)malloc(strlen(e)*sizeof(char));
  while(*e!='\0'){
      *p++=*e++;
   }
  *p='\0';
  return p;
}
这段代码能不能实现将字符串e复制到p中去?
ps:贴全代码不会占了很多位置?
回复

使用道具 举报

发表于 2007-5-23 22:21 | 显示全部楼层
贴全代码不会占了很多位置?

回复

使用道具 举报

发表于 2007-5-23 22:31 | 显示全部楼层
原帖由 Freedomer 于 2007-5-23 21:54 发表
看来想简化一点都不行...
char *copy(char *e){
char*p;
p=(char*)malloc(strlen(e)*sizeof(char));
  while(*e!='\0'){
      *p++=*e++;
   }
  *p='\0';
  return p;
}
这段代码能不能实现将字符 ...


可以是可以
     a            a
     b            b
     c            c
e->\0     p-> \0

但是LZ你的代码执行完后的结果如上
这时候p指向的就是'\0'了
输出当然什么都看不到啦
回复

使用道具 举报

 楼主| 发表于 2007-5-23 22:43 | 显示全部楼层
原帖由 再见型过笼 于 2007-5-23 22:31 发表


可以是可以
     a            a
     b            b
     c            c
e->\0     p-> \0

但是LZ你的代码执行完后的结果如上
这时候p指向的就是'\0'了
输出当然什么都看不到啦

我也想过这个问题,所以我过成下面,可以吗?
char *copy(char *e){
char*p;int i=0;
p=(char*)malloc(strlen(e)*sizeof(char));
  while(*e!='\0'){
      *p++=*e++;i++;
   }
  *p='\0';
  p=p-i;
  return p;
}
回复

使用道具 举报

发表于 2007-5-24 00:08 | 显示全部楼层
原帖由 iptton 于 2007-5-23 21:40 发表
在C++中,变量是会自动初始化的,在C中变量不初始化它的值是个未知数,分配到的空间原本是什么数据就什么数据,不一定是 很小的负数……


char *copy(char *e)
{
  while(*e!='\0')
  {
      *p++= ...


我真是服了你们了。。。
自动初始化是有场合的。。普通情况下是不自动初始化的。。

#include <iostream>
using namespace std;
int main(){
          int i;
          cout<<i<<endl;
}

[ 本帖最后由 brilon 于 2007-5-24 00:09 编辑 ]
回复

使用道具 举报

发表于 2007-5-24 00:30 | 显示全部楼层
不管变量会如何初始化,自己手动赋想要的值总是好习惯来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 12:07

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表