Re: вопросы по C++ на собеседование
От: MaximE Великобритания  
Дата: 10.02.06 11:06
Оценка:
On Fri, 10 Feb 2006 08:40:23 -0000, st. <48533@users.rsdn.ru> wrote:

> 31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?


В С можно делать так без кастов:

unsigned char* s = "blah";


Преобразование void* -> whatever* неявное.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[3]: вопросы по C++ на собеседование
От: Bell Россия  
Дата: 10.02.06 12:13
Оценка:
Здравствуйте, Conductor, Вы писали:


st.>>>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?

B>>рекурсивно вызывать main.

C>Это с чего это?

Что "с чего это"?
Любите книгу — источник знаний (с) М.Горький
Re[4]: вопросы по C++ на собеседование
От: Pavel Dvorkin Россия  
Дата: 10.02.06 12:24
Оценка: :))
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>Помню, помню, была у нас системка написанная на сях, когда переводили под С++, нарвались на идентификатор переменной new. Не забыть никогда


L_L>Я думаю, как раз случай с new легко обнаруживался и исправлялся. Вообще, вопрос был что можно сделать в С такого чего нельзя в С++ и потому использование идентификаторов-ключевых слов С++ — нормальный ответ. Я вот встречался с программой на С, в которой были имена функций and/or (хотя, они, конечно, не ключевые слова, но альтернативные токены в С++)



void main()
{
char bool;
int dynamic_cast = 0, static_cast =1;
int public, private = 0, protected = 1, try = 2, catch = 3;
bool = dynamic_cast == static_cast;
public = private * protected;
try = catch = bool;

}



вполне нормально компилируется и выполняется в C, хотя все эти слова подсвечиваются синим в редакторе
With best regards
Pavel Dvorkin
Re: вопросы по C++ на собеседование
От: Pavel Dvorkin Россия  
Дата: 10.02.06 12:32
Оценка:
Здравствуйте, st., Вы писали:

st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?

st.>Если можно, с кратким пояснением.

1. Вызывать функцию, которая не была до этого декларирована.

void main()
{
int k = f();
}

int f()
{
return 0;
}

// а если f вообще отсутствует — откомпилируется, но будет ошибка при линковке


2. Присваивать числовую константу указателю

char * p = 123;

3. Присваивать друг другу указатели разного типа

int *pi = p; // p из п. 2

Можно и еще что-то вспомнить, наверное.

В С такое пройдет (с предупреждением), в С++ — нет.
With best regards
Pavel Dvorkin
Re[2]: вопросы по C++ на собеседование
От: Bell Россия  
Дата: 10.02.06 12:49
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>1. Вызывать функцию, которая не была до этого декларирована.

В C99 уже нельзя.

PD>2. Присваивать числовую константу указателю

PD>char * p = 123;

PD>3. Присваивать друг другу указатели разного типа

PD>int *pi = p; // p из п. 2

Ни в C89 ни в C99 пункты 2 и 3 сделать нельзя.
Любите книгу — источник знаний (с) М.Горький
Re[4]: вопросы по C++ на собеседование
От: Conductor СССР  
Дата: 10.02.06 12:50
Оценка:
Это требование стандарта? Но и в 6-ой студии (ладно, тогда стандарта еще не было), и в 2003-й (он уже был) прекрасно рекурсивные вызовы main прокатывают.
Re[5]: вопросы по C++ на собеседование
От: Bell Россия  
Дата: 10.02.06 13:07
Оценка: 2 (1)
Здравствуйте, Conductor, Вы писали:

C>Это требование стандарта?

5.2.2/9
Recursive calls are permitted, except to the function named main (3.6.1).



C>Но и в 6-ой студии (ладно, тогда стандарта еще не было), и в 2003-й (он уже был) прекрасно рекурсивные вызовы main прокатывают.


Это одно из несоответствий.
Любите книгу — источник знаний (с) М.Горький
Re[2]: вопросы по C++ на собеседование
От: Lorenzo_LAMAS  
Дата: 10.02.06 13:53
Оценка:
ME>
ME>unsigned char* s = "blah";
ME>


С какой стати?
Of course, the code must be complete enough to compile and link.
Re[4]: вопросы по C++ на собеседование
От: L2-Max Украина  
Дата: 10.02.06 14:02
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, L2-Max, Вы писали:


LM>>Здравствуйте, Аноним, Вы писали:


st.>>>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?

А>>>Неопределенное поведение

LM>>Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free


VE>И где же оно определено для ВСЕХ реализаций ?

VE>Так можно сказать, что и
VE>A *a = new A[100]; delete a; тоже определено.
VE>Например, микрософтские некоторые (не проверял, мб и все) просто вызовут только один деструктор. Определено поведение ?

Нет, ну вы одолели сударь. Неужели не понятно. Причем тут деструкторы, причем тут связка new[] delete[]. Был вопрос, каков будет результат при вызове free для указателя созданного new. Я ответил лишь, что если взять, к примеру, VC6, то я знаю, что там память выделяется с помощю malloc.

смотрим:

void* p(new char); //эквивалентно void* p(malloc(1)); для интегрального типа конструктор не вызовется
free(p);

результат предсказуем ?
L2-Max
Re: вопросы по C++ на собеседование
От: st.  
Дата: 10.02.06 15:23
Оценка:
благодарю за ответы. Теперь у меня на пару козырей больше Еще такие вопросы:

12. Что такое автоматический указатель?
19. Что такое безымянная конструкция?
Re[3]: вопросы по C++ на собеседование
От: MaximE Великобритания  
Дата: 10.02.06 15:37
Оценка: :)
On Fri, 10 Feb 2006 13:53:19 -0000, Lorenzo_LAMAS <14979@users.rsdn.ru> wrote:

> ME>
> ME>unsigned char* s = "blah";
> ME>

>
> С какой стати?

Да, херню я ляпнул; слышал звон да не знаю где он

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re: вопросы по C++ на собеседование
От: FoolS.Top Армения  
Дата: 11.02.06 13:26
Оценка:
Здравствуйте, st., Вы писали:

st.>Доброго времени суток всем.


st.>У меня тут пара вопросов, на которые нужно найти ответ:


st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?

st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?

st.>Если можно, с кратким пояснением.


st.>Заранее благодарен за помощь.


31. По моему в C согласно новому стандарту можно такое


void function(int size)
{
   char a[size];
   ...
}
Feierlich, misterioso
Re[2]: вопросы по C++ на собеседование
От: Аноним  
Дата: 13.02.06 09:43
Оценка:
Здравствуйте, st., Вы писали:

st.>благодарю за ответы. Теперь у меня на пару козырей больше Еще такие вопросы:


st.>12. Что такое автоматический указатель?

st.>19. Что такое безымянная конструкция?

Напишите,пожалуйста,все вопросы.
Или дайте адресок.
Re[3]: вопросы по C++ на собеседование
От: Pavel Dvorkin Россия  
Дата: 13.02.06 13:23
Оценка:
Здравствуйте, Bell, Вы писали:

PD>>3. Присваивать друг другу указатели разного типа

PD>>int *pi = p; // p из п. 2

B>Ни в C89 ни в C99 пункты 2 и 3 сделать нельзя.


Честно говоря, стандарты я сто лет не читал, но последнее в VC6 компилируется и работает. Он 1998 года, так что C99 не может удовлетворять, но почему не удовлетворяет C89 — не знаю.
With best regards
Pavel Dvorkin
Re[2]: вопросы по C++ на собеседование
От: Lorenzo_LAMAS  
Дата: 13.02.06 13:27
Оценка:
Есть в С99 вроде еще одна интересная вещь — "перегрузка макросов" — у них вроде так sin/cos для разных типов есть. Причем эта "перегрузка" макросов используется только реализацией, программист сам такого сделать не может.
Of course, the code must be complete enough to compile and link.
Re[3]: вопросы по C++ на собеседование
От: DIMEDROLL Украина  
Дата: 24.05.09 18:21
Оценка: :)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

ME>>
ME>>unsigned char* s = "blah";
ME>>


L_L>С какой стати?


только что проверил на 2005 студии, в Си компилится в С++ — нет
Re[4]: НЕКРОПОСТЕР!!! :((( (-)
От: Erop Россия  
Дата: 24.05.09 19:23
Оценка:
Здравствуйте, DIMEDROLL, Вы писали:

DIM>только что проверил на 2005 студии, в Си компилится в С++ — нет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: вопросы по C++ на собеседование
От: K13 http://akvis.com
Дата: 25.05.09 04:57
Оценка:
LM>Нет, ну вы одолели сударь. Неужели не понятно. Причем тут деструкторы, причем тут связка new[] delete[]. Был вопрос, каков будет результат при вызове free для указателя созданного new. Я ответил лишь, что если взять, к примеру, VC6, то я знаю, что там память выделяется с помощю malloc.

LM>смотрим:


LM>void* p(new char); //эквивалентно void* p(malloc(1)); для интегрального типа конструктор не вызовется

LM>free(p);

LM>результат предсказуем ?


Нифига подобного. Например, существует либа, определяющая operator new / operator new[] / operator delete / operator delete[] и никак не завязанная на malloc/free (или как минимум выдающая в качестве результата указатель, не являющийся результатом malloc).

Корректный код будет нормально работать что с этой либой что без нее.
А вот код, не соблюдающий парность вызовов -- рухнет.
Re[6]: вопросы по C++ на собеседование
От: K13 http://akvis.com
Дата: 25.05.09 04:58
Оценка: +1 :))
K13>Нифига подобного.

Сорри, не посмотрел на дату поста.
Re: вопросы по C++ на собеседование
От: Аноним  
Дата: 25.05.09 09:45
Оценка:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Я бы ответил что много чего плохого, в частности — undefined behaviour. Потому что из вопроса не понятно, КАКОЙ оператор new используется — а может пользовательский какой...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.