Qraizer

Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору SaDFromSpb Цитата: Я не имел ввиду, что их сущности станут одинаковыми, я имел ввиду, что после приравнивания pch к charr, не будет разницы, обращаешся ли ты к элементам массива через pch или через charr. | Я так и подумал, но не факт, что так же подумали и другие. Поэтому и обратил твоё внимание на двусмысленность (если не сказать "ошибочность") фразы. Если получилось резковато - каюсь, не хотел. Цитата: Цитата: Компилятор работает по стандарту, а он говорит, что допустимо неявное кастование T[] в T *const и присваивание константых объектов неконстантным... | Это несколько абстрактная фраза и, по-моему, она еще не доказывает, что я ошибаюсь. | Она не абстрактная - она общая, и её частным случаем является присваивание массива указателю. А ошибаешься ты в том, что считаешь, будто компилятор это делает по собственной инициативе, потому как его авторы наделили его информацией об эквивалентности типов "массив" и "указатель". Я же показал, что действия компилятора в этом случае мало отличаются от действий при смешанном присваивании int-ов и float-ов - в обоих случаях имеет место неявное приведение типов, чётко описанное стандартом. Цитата: Расскажи, что конкретно происходит при операции charr[3] = 'a'? Как работает компилятор? Ведь он рассчитывает смещение, равное 3 от адреса первого элемента? | Да. Вот точное описание всех действий: 1) операция [] к переменной типа char[10] неприменима, поэтому компилятор пытается выполнить эту операцию с помощью преобразований типов; 2) в частности ему известен способ привести char[] в char *const, что он и делает; 3) операция [] к переменной типа char *const уже применима, при условии что вторым операндом является перечислимый или интегральный тип, что имеет место; 4) выполняется операция operator[](char *const, int) (которая эквивалентна *(operator+(char *const, int))), результатом которой является значение типа char и класса lvalue; говоря языком C++ (но не C) это будет char&; 5) выполняется операция присваивания operator=(char&, const char), которая не вызывает у компилятора никаких вопросов; это же const char - только в виде char& - и возвращается, как результат операции присваивания; правда это значение программой игнорируется. Вполне подробно, ИМХО. Если считаешь, что я погорячился с первыми двумя пунктами, загляни в 5.2.1 и 8.3.4 стандарта. Там чёрным по белому написано, что операция [] применима к указателям, а массивы предварительно к указателям кастуются. Цитата: Цитата: Не запутывайся сам, да не запутаешь и других. | Извини, если задел, но, мне кажется не стоило говорить, что во всех учебниках про массивы пишут ложь. | Вообще-то я перефазировал цитату "Не судите, да не судимы будете". Виноват, надо было поставить кавычки и смайлик. К сожалению, недосказанность, двусмысленность и иже с ними тоже являются разновидностями если не лжи, то хотя бы неправды. ИМХО ложью нужно считать любые попадающие под это определения фразы в учебной литературе. Подчёркиваю, в учебной литературе. Так что не буду брать слов назад. Авторы (переводчики?) сами виноваты. В заблуждение попасть очень легко, а потом не(пробел)опытным программистам это обходится недёшево. Чего стОит только, попав в такое заблуждение, въехать в приколы типа Код: void f(char** x); char y[10][20]; int main() { /* ... */ f(y); /* ... */ } |
Цитата: Так или иначе в них доносится мысль, что имя массива можно воспринимать как указатель на его первый элемент (в некоторых, может быть, это делается плохо). | Именно. Между тем в стандарте явно это преобразование описывается в 4.2, и причём абсолютно однозначно и без кривотолков. Цитата: И между int и float аналогия совсем не та. | Как я уже говорил, разница между T*=T[] и int=float всего лишь количественная, но никак не качественная. Так что аналогия вполне в тему. | Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 22:30 13-11-2006 | Исправлено: Qraizer, 13:17 14-11-2006 |
|