LINUX.ORG.RU
ФорумTalks

собеседование на знание си


0

1

В общем, через неделю я приглашен на собеседование по языку си. Немного страшновато. В принципе, на си пишу уже год. Есть несколько моих программ с gtk+. В общем, кто проходил подобные собеседования отпишитесь пожалуйста какого типа вопросы там обычно задают? Что знать нужно?

Хотя и собеседование как бы вступительное на курсы по С++, т.е. наверно, валить сильно не будут, но все равно страшно.

★★★★★
Ответ на: комментарий от NightmareZ

пробовал, и даже продолжаю, но видимо я туп ((

асло: щаз на Quizful тест на основы С прошел на 75% ((

antony986
()
Ответ на: комментарий от Reset

int main()
{
printf(«hello\n»);
fflush(1);
fork();
}

хм это странно, надо курить как форк в линуксе работает или под gdb запускать.

dimon555 ★★★★★
()

сотка хорошего православного d-мета и ты порвешь любого экзаминатора %-)
проверено, правда на перле

anonizmus
()
Ответ на: комментарий от Reset

Вот тут http://linux.tultip.net/FORK.htm написано:

Каждый дескриптор файла порожденного процесса разделяет с соответствующим родительским дескриптором файла общий указатель текущей позиции в файле.

Т.е. правильно я понимаю, если родительский процесс пишет, то у дочернего текущая позиция в файле тоже меняется?

hibou ★★★★★
() автор топика
Ответ на: комментарий от Gvidon

> 3) 2[«abc»]. Корректна ли такая запись, если да, то почему?

6) struct a { int aa; char bb; }; Чему будет равен sizeof(struct a) на 32-разрядной машине?


Иногда складывается ощущение, что берут именно тех, кто _знает_ ответы на эти вопросы.

А потом по всему коду выражения типа i[pointer_variable] и константы вместо sizeof(a).

А, ну да, ещё святое #define begin { , #define end } и #define extends :

pv4 ★★
()
Ответ на: комментарий от pv4

Что интересно, знание ответов на подобные вопросы никак не сказывается на способности человека к адекватному промышленному программированию, поэтому зачем их задают мне не понятно :)

Reset ★★★★★
()
Ответ на: комментарий от Reset

Я считаю что подобные вопросы помогают узнать понимает ли человек то что происходит в процессе компиляции/исполнения, а то можно рабочий код то и не плохой писать (правда этот вопрос я еще не решил, можно или не можно), но не понимая сути.
Правда только по подобным вопросам судить кандидата тоже глупо.

urxvt ★★★★★
()
Ответ на: комментарий от dimon555

> напиши правильный ответ

Подучи разницу между C/C++ стримами и POSIX дескрипторами файлов.

Manhunt ★★★★★
()
Ответ на: комментарий от Reset

> int main() { printf(«hello»); fork(); }

Некорректный вопрос. Есть множество правильных ответов.

no-dashi ★★★★★
()
Ответ на: комментарий от elipse

CDE?! Классно! Вот ведь когда-то было единство, не то что сейчас всякие кеды, гномы... цельная система UNIX. :)

hibou ★★★★★
() автор топика
Ответ на: комментарий от Gvidon

>5) Что-то было на макросы, сейчас уже не помню.

Что то в духе: #define TWO_X(x) 2*x

printf(«2x=%d \n»,TWO_X(3+4));

только не столь явно

dn2010 ★★★★★
()
Ответ на: комментарий от hibou

> Т.е. правильно я понимаю, если родительский процесс пишет, то у дочернего текущая позиция в файле тоже меняется?

нет. после разделения процессы условно-независимы, побочный действий не накладывают друг на друга

namezys ★★★★
()
Ответ на: комментарий от namezys

Как в runtime определить big-endian или little-endian машины

Не знаю, как правильно. Первое, что в голову пришло:

int isLittleEndian()
{
	int i = 1;
	return *(char *)&i;
}

int isBigEndian()
{
	return !isLittleEndian();
}

NightmareZ
()

Что вернёт этот код?

#include <stdio.h>

main(t,_,a)
char *a;
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \
i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

matich
()
Ответ на: комментарий от NightmareZ

Да. Работа с указателями на целые типы разной размерности

namezys ★★★★
()
Ответ на: комментарий от namezys

как определяется char по стандарту?

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

NightmareZ
()
Ответ на: комментарий от Legioner

> Целочисленный тип, sizeof которого равен единице, afaik.

не правильно. sizeof - оператор, результат которого изчисляется в размерах char. то есть sizeof(char) = 1 по определению sizeof

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

Достаточный для хранения верхней таблицы символов. то есть 0...127

namezys ★★★★
()
Ответ на: комментарий от urxvt

Попробую. В библиотеке libc используется внутренняя буферизация. Печать на терминал вызывается обычно после конца строки и во время завершения работы программы. Если использовать первый вариант, после вызова printf в кешах останутся данные которые нужно вывести, но реально они не будут выведены. fork() скопирует эти буферы, и во время завершения работы программы они оба сбросятся. Отсюда и дублирование. Если печатать \n, то буферы сбрасываются сразу, и программа работает как ожидается.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> Если печатать \n, то буферы сбрасываются

А если строка имеет длину 512 миллионов символов?

no-dashi ★★★★★
()
Ответ на: комментарий от Reset

>Скажи что выведет вот эта программа, не запуская её.

fork() - unix-оnly, поэтому этот пример никуда не годится

frame ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.