Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизЗадачки по Си Найти похожие ветки
← →
Lamer@fools.ua © (2005-09-02 16:00) [40]>>БарЛог © (02.09.05 12:51) [35]
>1. 1 байт
2. 5 байт + длина массива тоже наверно хранится = 6 байт
3. 5*5 байт + 2 байта (размерность массива) = 27 байт
4. А так разве можно? :)
1. Да.
2. Нет.
3. Нет.
4. Можно.
← →
БарЛог © (2005-09-02 19:36) [41]Lamer@fools.ua © (02.09.05 16:00) [40]
Кажется в 4. мы, как я понял, создаем массив из 3-х элементов "*".
Вот с "памятью" у меня не очень :(
Не подскажете правильные ответы?
Желательно с пояснениями.
← →
Канадец (2005-09-02 20:12) [42]palva © (01.09.05 11:13) [31]
char c3[5,5];
Это что за объявление такое?
char c1;
char c2[5];
char c3[5,5];
char c4[] = "***";
>БарЛог © (02.09.05 19:36) [41]
1. 1 байт. Пояснения я думаю не требуются.
2. 5 байт. Никаких размеров массива в С нет.
3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
4. 4 байта. Три символа в строке + символ конца строки
← →
БарЛог © (2005-09-02 20:55) [43]Канадец (02.09.05 20:12) [42]
Тьфу ты! Как все просто :)
(Особенно про строку в конце!)
Думаю, в "char c3[5,5];" имеется ввиду char "c3[5][5];" ... это все паскаль\делфи - привычка.
← →
Lamer@fools.ua © (2005-09-04 22:50) [44]>>БарЛог © (02.09.05 19:36) [41]
1. = sizeof(char)
2. = sizeof(char) * 5
3. = sizeof(char) * 5 * 5
4.char c4[] = "***"
эквивалентноchar* c4 = "***"
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя: в Win32 - 4 байта, в DOS - зависит от модели сборки (tiny, small, large, huge etc.).
← →
palva © (2005-09-04 23:37) [45]3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
3. = sizeof(char) * 5 * 5
Правильный ответ 5 (конечно, если sizeof(char) равно единице, я не знал, что бывает иначе).
При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.
Следующая программа, в которой ошибочно для отделения дробной части числа применена запятая, напечатает 15
#include <stdio.h>
void main() {
printf("%d\n", (4*2,5+10));
}
Если убрать внутренние скобки то будет напечатано 8, поскольку символ "," будет рассматриваться уже не как арифметическая операция, а как символ разделения списка параметров при обращении к функции.
char c4[] = "***"
не эквивалентно
char* c4 = "***"
В первом случае компилятор выделит четыре байта и заполнит их соответственно. Во втором случае будет создан указатель и дополнительно массив из четырех байтов, на который этот указатель указывает. sizeof будет одинаковый (Win32), но смысл будет разный. В первом случае это размер массива, во втором - размер указателя.
← →
Канадец (2005-09-05 02:51) [46]>Lamer@fools.ua © [44]
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя
Читай последний абзац palva © [45], он всё доходчиво объяснил. От себя лишь добавлю: тот факт что в С имя массива фактически означает указатель на его начало, совсем не означает, что sizeof от этого имени даёт размер указателя.
>palva © [45]
При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.
IHMO совсем не факт, что компилятор разберётся в подобных хитросплетениях. Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа. Других у меня нет чтобы попробовать.
Вообще это всё конечно интересно с чисто познавательной точки зрения, но упаси Господи встретить такое в коде.... Хотя есть такие индивидумы, которые стараются сказку сделать былью не думая башкой, что этот код кто-то после них разбирать будет. Как то на заре своей юности я очень долго чесал репу кода разбирая чей-то код увидел что-то вроде этого:
char c2[5];
2[c2] = "s";
← →
Джо © (2005-09-05 02:53) [47]
> char c2[5];
> 2[c2] = "s";
Это шо ж такое?
← →
Lamer@fools.ua © (2005-09-05 09:18) [48]>>Канадец (05.09.05 02:51) [46]
Да. С 4-м я лопухнулся.
← →
palva © (2005-09-05 10:50) [49]Канадец (05.09.05 02:51) [46]
> Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа.
Да, здесь я был неправ, нужно было проверить на компьютере.char m[3+5]
срабатывает, аchar m[3,5]
нет. Если поставить дополнительные скобки char m[(3,5)], то работать будет, но сразу же будет раскрыта замаскированная подколка. Более продвинутые сишники на Форуме, наверно, объяснят почему такая разница между операциями "+" и ",". Нужно было придумать другую задачу с маскировкой операции запятая.
> упаси Господи встретить такое в коде
Паскалисты переходя на си делают такую ошибку ОЧЕНЬ часто. См. выше в этой ветке в [19]mas[i,j]=mas[i2,j2];
В данном случае компилятор сообщит об ошибке, потому что не сможет присвоить указатель. Но может быть ситуация, когда подобная ошибка не вызовет диагностики - просто работать будет не так как ожидалось. Например программа
#include <stdio.h>
void main() {
int c[3][5];
c[1][1] = 5;
printf("%d\n", c[1,1]);
}
Откомпилируется и будет работать, но печатать будет некое большое число, а не 5.
← →
MOA © (2005-09-05 11:16) [50]>если sizeof(char) равно единице, я не знал, что бывает иначе
Хм, а разве иначе бывает? Я был уверен, что по стандарту sizeof(char) тождественно равно 1 - так определена операция sizeof.
(Вот в подтверждение кусок из MSDN - другого учебника по С быстро не найти:
The sizeof operator yields the size of its operand with respect to the size of type char.)
Другое дело, что к-во битов в char может быть разным ;).
И позвольте тоже парочку примеров:
int a, b, c;
...
//Как проще записать следующие операции?
a = ~a + 1;
b <<=1;
c >>=1;
:)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.037 c