上善若静水

while(effort=true){success++;}

   :: 首页 :: 联系 :: 聚合  :: 管理
  9 Posts :: 10 Stories :: 11 Comments :: 0 Trackbacks

留言簿(1)

搜索

  •  

积分与排名

  • 积分 - 41429
  • 排名 - 512

最新随笔

最新评论

阅读排行榜

评论排行榜

   #include <stdlib.h>
   #include <iostream.h>
   void main()
   {
      int num = 123;
      const unsigned int NO = 5;
  // 如果将这两条语句改为 char *cNum = "   ";在执行程序时候将会产生
      char cNum[NO];                 // 严重的错误而终止.
      itoa(num, cNum, 10);
      cout<<cNum<<endl;
   }



      使用  const unsigned int NO = 5; char cNum[NO];    NO 的大小可以随意改.为什么?  为什么不可用指针类型的参数传给itoa() 的第二个参数?
posted on 2006-09-25 09:45 上善若静水 阅读(4433) 评论(5)  编辑 收藏 引用

Feedback

# re 1: 2006-09-25 12:05 周星星
// 如果将这两条语句改为 char *cNum = " ";在执行程序时候将会产生严重的错误而终止.
---
int num = 123;
const unsigned int NO = 5;
char cNum[NO];
itoa(num, cNum, 10);
是不是完全等同于
itoa(123, (char*)" ", 10);
? 但" "是个常量字符串,不可以被修改。
BTW1:DOS16系统中,内存access没有任何保护措施,所以可以执行通过;
BTW2:之所以 char *cNum = " " 能够编译通过,是为了兼容DOS16遗留下的大量旧代码,你需要自己保证不修改它们。正确的应当写成 const char* cNum = " ";  回复  更多评论
  

# re 2: 2006-09-25 12:10 周星星
// 使用 const unsigned int NO = 5; char cNum[NO]; NO 的大小可以随意改.为什么? 为什么不可用指针类型的参数传给itoa() 的第二个参数?
--- 不明白你是什么意思,NO的值在编译期间就已经确定了,而不是在运行时才确定,所以怎么可以说“NO 的大小可以随意改”?如果你写成 unsigned int NO = 5; 也就是前面没有const,那才应该报错。

BTW:C99新增了动态数组,也就是
unsigned int NO = 5;
char cNum[NO];
也可以编译通过,虽然C++中没有此项特性,但某些编译器(比如g++)也允许这样的代码成功运行。  回复  更多评论
  

# re: 关于函数 itoa() 使用中的问题 2006-09-26 12:27 静水流深
@周星星(谢谢兄弟回复)
有些符号被翻译成HTML语言了,不能正常显示,希望能看懂
我使用的编译环境是VC6.0,如果说把 char *cNum = " ";改为
const char *cNum = " "; 那么程序将变为
//////////////////////////////////

#include
#include
void main()
{
int num = 123;
const char *cNum = " ";
itoa(num, cNum, 10);
cout<< }


/////////////////////////////////////
编译器有错误提示:
error C2664: 'itoa' : cannot convert parameter 2 from 'const char *' to 'char *'
你说的这个方法好像实施不通.

  回复  更多评论
  

# re: 关于函数 itoa() 使用中的问题 2006-09-26 12:59 静水流深
@周星星(谢谢兄弟指点)
都是我的错,没有把问题说清楚,担误了你的时间

#include <stdlib.h>
#include <iostream.h>
void main()
{
int num = 123;
const unsigned int NO = 1; //我的意思是此名NO改为1或2
char cNum[NO];
itoa(num, cNum, 10);
cout<<cNum<<endl;
}

我有一个问题:如果NO改为1或者2,则定义一个能存储1个或者2个元素的数组,而字符串为"123"长度为4,怎么能用我定义的这个数组存储?而我用VC6.0编译通过,结果也下常,就是不懂其中的原因,请指教  回复  更多评论
  

# re: 关于函数 itoa() 使用中的问题 2006-09-26 13:40 周星星
:)你的问题已经说得很清楚了,而我的回答也丝毫没有错,问题在于你没有看懂我的回答。

对于第一个问题,你修改常量本身就是不符合逻辑的。如果你记住不再将 const char* cNum = " " 写成 char* cNum = " " 的话,你就能在编译时发现这个错误。

对于第二个问题,char cNum[1]合法吧?把1改为2,也就是char cNum[2]也合法吧?它们和
const unsigned int NO = 1;
char cNum[NO];
没有丝毫区别呀,这里的 NO 和 1, 2 都是编译时就能确定的常量。

“如果NO改为1或者2,则定义一……”
--- 语法没有问题,当然编译能通过
对于结果,C/C++没有规定其行为,那么其行为就是未定义的
如果C/C++规定其必须运行正确,那么编译器就必须保证编译出来的程序运行正确;
如果C/C++规定其必须运行错误,那么编译器就必须保证编译出来的程序运行错误;
如果C/C++对其(数组越界)未作定义,那么其行为就看天意。对于未定义的行为应当避免使用,因为其不能保证运行正确,不能保证运行正确 不等于 运行一定错误。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理