我的书是这样说的:
char *p="Hello"; //pointer is variable, string is constant
*p='M'; // error
p="bye"; // works嗯,在C中,我的第二行没有给我任何错误,在C++中也没有。
我在Windows7上使用的是Turbo C++。现在如果我尝试在gcc或其他系统上使用,上面的事情是真的。
同样在类似的行上,如果本书正确地解释了上述代码,
#include<iostream.h>
void display(char*);
void display(const char*);
void main()
{
char* ch1="hello";
const char *ch2="bye";
display(ch1);
display(ch2);
}
void display(char* p)
{
cout << p << endl;
}
void display(const char* p)
{
cout << p << endl;
}我的书是不是认为char*和const char*是一样的,因为如果是这样,那么上面的代码就不能工作了,因为参数将是相同的?
(虽然我在turbo +windows上得到了输出Hello bye。)
哪一个是正确的?
发布于 2011-11-12 11:58:49
语言规范不是编译器向您做出的承诺,而是您和编译器都签署的相互合同。(当然,打个比方。显然,这不是一个具有法律约束力的合同。)如果你通过编写*p='M';违反了约定,那么你就触发了“未定义的行为”,你不能期望编译器有任何特定的行为:也许它会严格要求它,并给你一个编译错误,也许它只是在运行时变得不稳定。。。你没有遵守协议,现在它被允许做任何它想做的事情。另请参阅:http://catb.org/jargon/html/N/nasal-demons.html。
发布于 2011-11-12 12:19:36
问题:
“现在我的书是不是认为
char*和const char*是一样的,因为如果是这样,那么上面的代码就不能工作了,因为参数将是相同的?”
你可能曲解了你的书。
它可能不会认为这些类型是相同的,因为它们不是相同的。
现在来看你的代码:
#include<iostream.h>H不是标准C++的一部分。C++是在1998年标准化的,这个标准化取消了ARM时代的iostream.h。因此,现代编译器很可能会被这一点卡住。
作为一种变通办法,当您得到一个不那么古老的编译器时,您可以使用…
#include <iostream>
using namespace std;接下来,
void display(char*);
void display(const char*);在文件顶部声明函数通常只会产生额外的工作。这通常意味着维护函数的两个声明。当你只需要处理一个声明的时候。
void main()在标准C和标准C++中,main为,不允许具有除int之外的任何其他结果类型。
作为一种语言扩展,Visual C++是一种允许使用void的编译器。
然而,使用这种可能性是非常愚蠢的,因为它更需要编写,并且只会使代码变得非标准,并且很可能无法使用其他编译器进行编译。
{
char* ch1="hello";根据C++11规则,上面的代码将无法编译。它在C++98中已被弃用,并在C++11中被移除。然而,AFAIK当前的编译器仍然允许它,但有些人有一个可以打开的警告。
const char *ch2="bye";
display(ch1);
display(ch2);
}上面的代码还可以,不过添加一个额外的const也没什么坏处,比如
const char* const ch2="bye";发布于 2011-11-12 12:23:51
char* ch1="hello";是在C++中不推荐使用的。正确的方法是const char*。因为"hello"存储在只读区域中。此外,int main()或int main(int, char**)是定义main()的正确方式。
不要使用Turbo C,它是一个过时的编译器。去找gcc或者MSVC吧。此外,不要使用提供这种不正确信息的书籍。
https://stackoverflow.com/questions/8102397
复制相似问题