以下是我的书中所说的内容:
char *p="Hello"; //pointer is variable, string is constant
*p='M'; // error
p="bye"; // works
好吧,在C中,我的第二行没有给我任何错误,在C ++中都没有。
我在Windows 7上使用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。)
哪一个是正确的?
答案 0 :(得分:6)
语言规范不是编译器对您做出的承诺,而是您和编译器都签署的共同合同。 (当然,这是隐喻性的。显然,这不是具有法律约束力的合同。)如果你通过写*p='M';
来违反合同,那么你就会触发“未定义的行为”,你不能指望任何特定的行为来自编译器:也许它会对它严格并给你一个编译错误,也许它会在运行时变得不稳定。 。 。你没有阻止你的讨价还价的结束,而且它允许现在无论它想要什么。另见:http://catb.org/jargon/html/N/nasal-demons.html。
答案 1 :(得分:2)
问题:
“我的书现在考虑
char*
和const char*
,因为如果是,那么上面的代码将不起作用,因为参数将是相同的?”
嗯,你可能会歪曲你的书。
它可能不会认为这些类型是相同的,因为它们不相同。
现在你的代码:
#include<iostream.h>
[iostream.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";
干杯&amp;第h。,
答案 2 :(得分:0)
char* ch1="hello";
在C ++中被弃用。正确的方法是const char*
。因为"hello"
存储在只读区域中。此外,int main()
或int main(int, char**)
是定义main()
的正确方法。
不要使用Turbo C,它是一个过时的编译器。去gcc或MSVC。另外,请勿使用提供此类错误信息的书籍。
答案 3 :(得分:0)
char *p="Hello"; //pointer is variable, string is constant
允许使用此代码,因为它在C语言获得const
关键字之前很久就有效了。
为了不破坏旧代码,C和C ++标准只记录了这应该像以前一样工作。
但是,如果您编写新代码,则应使用正确的const char*
形式。