const char * против char * - PullRequest
       1

const char * против char *

2 голосов
/ 12 ноября 2011

Вот что написано в моей книге:

char *p="Hello"; //pointer is variable, string is constant
*p='M'; // error
p="bye"; // works

Ну, в C моя вторая строка не дает мне никакой ошибки, ни в C ++.

Я использую Turbo C ++ на Windows 7. Теперь вышесказанное верно, если я попробую в 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* то же самое, потому что, если это так, приведенный выше код не будет работать, так как аргументы будут одинаковыми?

(хотя я получаю вывод Hello bye на turbo + windows.)

Какой из них правильный?

Ответы [ 4 ]

6 голосов
/ 12 ноября 2011

Спецификация языка - это не обещание, которое дают вам компиляторы, а взаимный договор, который вы и компиляторы подписываете.(Говоря метафорически, конечно. Очевидно, что это не юридически обязывающий контракт.) Если вы нарушаете контракт, написав *p='M';, то вы вызвали «неопределенное поведение» и не можете ожидать какого-либо конкретного поведения от компилятора.: может быть, это будет строго по этому поводу и даст вам ошибку компиляции, может быть, это просто пойдет не так во время выполнения.,,Вы не продлили свой конец сделки, и теперь можно делать буквально все, что он хочет.Смотрите также: http://catb.org/jargon/html/N/nasal-demons.html.

2 голосов
/ 12 ноября 2011

Вопрос:

«Теперь моя книга рассматривает 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";

Приветствия и hth.,

0 голосов
/ 12 ноября 2011
char *p="Hello"; //pointer is variable, string is constant

Этот код разрешен, поскольку он действителен задолго до того, как язык C получил ключевое слово const.

Чтобы не сломать старый код, стандарты C и C ++ только что зарегистрировали, что это должно работать как прежде.

Однако, если вы пишете новый код, вы должны использовать правильную форму const char*.

0 голосов
/ 12 ноября 2011
char* ch1="hello";

является устаревшим в C ++.Правильный путь - const char*.Потому что "hello" хранится в области только для чтения.Кроме того, int main() или int main(int, char**) является правильным способом определения main().

Не используйте Turbo C, это устаревший компилятор.Перейти на GCC или MSVC.Кроме того, не используйте книги, которые предоставляют такую ​​неверную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...