Пролистав несколько тем на разных форумах, пришел к выводу, что начинать изучение С++ следует с книги Г. Шилдта "С++ руководство для начинающих". В целом книга очень понравилась, хоть и читать начал сравнительно недавно. На 164 странице(Глава Массивы, строки и указатели) представлен код, в котором в двемерный массив последовательно помещаются цисла от 1 до 12: Код (Text): #include <iostream> using namespace std; int main(){ int t,i, nums[3][4]; for(t=0;t<3;++t){ for(i=0;i<4;++i){ nums[t][i]= (t*4)+i+1; cout << nums[t][i] << ' '; } cout << '\n'; } return 0; } компилирую в VS2005, но вместо ожидаемого вывода таблицы чисел от 1 до 12 получаю 3 ряда с бессмысленым набором цифр. Помогите найти ошибку, т.к. сам я ее в упор не вижу.
с проблемой помогли разобраться, заменив Код (Text): cout << nums[t][i] << ' '; на Код (Text): cout << nums[t][i];
безсмысленные числа появляются из-за того, что ыместо пробела вы печатаете его код попробуйте вместо Код (Text): cout << nums[t][i] << ' ' поставить Код (Text): cout << nums[t][i] << " "
У тебя в Код (Text): cout << nums[t][i] << ' '; между кавычками два пробела. Оставь один и будет работать как полагается. А вот почему такое происходит, мне и самому интересно P.S. Все, понял. То, что стоит между кавычками, интерпретируется как число в 256-ичной системе.
проблему уже прояснили: в ковычках ' ' действительно 2 пробела, вот цитата из документации: "Символьной константой является один или несколько символов, заключенные в одиночные кавычки, например 'x'. Константа из одного символа имеет тип char. Символьные константы из нескольких символов имеют тип int. ". Признаюсь чесно, второй пробел я дописал сам, расчитывая на более читабельный вид таблицы .
scriper Не советую, по Шилду лучше шлифовать то, что у тебя уже есть в голове. А учиться рекомендую по Джессу Либерти "Освой самостоятельно С++ за 21 день". Блин, она это рулез!!! За 21 день конечно он прикольнулся, но сам язык ты ощутишь, а если после этой книги потом сразу Гради Буча про ООП так все, иди работать программером если эти книги понял )) На работе читай Кнута, поймешь их все 3, весь васм забухает, что хоть кто-то их понял до конца!
IceStudent Этого автора читал сначал я сам, потом дал другу а он с высшим экономическим образованием, а Сейчас он уже драйвера пишет! Всем кому рекомендовал, а это около 20 ти чел. Настолько мне щас благодарны, что даже незнают как выразить благодарность. К тому же я написал ранее, как обстоит делом на самом деле: >Блин, она это рулез!!! За 21 день конечно он прикольнулся, но сам язык ты ощутишь,
Я бы начал изучать С++ с книги, где приведённый пример записан как-то так (дело не в пробелах и скобочках) - Код (Text): #include <iostream> int main() { const unsigned max_t = 3, max_i = 4; int nums[max_t][max_i]; for ( unsigned t = 0; t != max_t; ++t ) { for ( unsigned i = 0; i != max_i; ++i ) { nums[t][i] = (t * max_i) + i + 1; // не уверен, что правильно понял автора std::cout << nums[t][i] << '\t'; } std::cout << '\n'; } } Хотя сразу возникает вопрос, зачем тут вообще массив (т.е. пример не учит жизни - сравните даже с примером из Кернигана и Риччи).
Вот мне и надоело возиться с IDE vs2005, только из командной строки cl.exe отказался запускаться требуя какието библиотеки. Нашел в msdn что следует перед использованием выполнить vsvars32.bat, который в процессе не сообщил не об одной ошибке, но и переменные среды создавать\обновлять не стал.
Итак, читаю Шилдта 5 день. В параграфе о строковых константах Шилдт пишет (цитирую): Если С++ компилятор обнаруживает строковой литерал, он сохраняет его в таблице строк программы и генерирует указатель на нужную строку. Поэтому следующая программа совершенно корректна и при выполнении выводит на экран фразу "Работа с указателями - сплошное удовольствие!.". Код (Text): #include <iostream> using namespace std; int main() { char *ptr; ptr= "Работа с указателями- сплошное удовольствие!\n"; cout << ptr; } То, что написал автор до меня доходит с трудом. Этот код я понимаю следующим образом: указатель ptr получает адрес первого элемента в строке, а cout работает со строкой как с массивом и заканчивает вывод, когда встречает нулевой символ \0. Хотелось бы узнать, насколько (не)верны мои представления.
Видимо, проблема перевода. Компилятор действительно сохранят где-то там строку (с завершающим нулём), но никакой указатель не "генерируется". Данная строка будет иметь лишь адрес (или правильнее - оффсет; как ты и написал - первого элемента). Этот адрес можно присвоить указателю ptr (причём - prt имеет тип char*, а строковый литерал const char* и происходит неявное приведение типа). А можно не присваивать: static const char msg[] = "Массивы тоже в какой-то мере указатели \n"; std::cout << msg; В этом случае никаких "лишних" переменных (ptr) не будет. Примерно так. Только детали будут понятны после знакомства с классами и перегрузкой функций. В данном случае, cout - это переменная-объект, а << - перегруженная функция-член, которая принимает указатель (const char*) и выводит символы от него и до '\0'. О массиве (тип имеющий характеристику - размерность) речь не идёт.