Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Игра в С++


Автор: FiMa1 28.8.2007, 15:19
Доброго здравия, друзья!
Очередная, небольшая задачка, заданная в г. N госпоже N на собеседовании:
Что делает приведенная ниже функция, для чего можно ее использовать? С какими значениями параметров целесообразно вызывать функцию, для чего предназначен каждый из параметров?
Т.к. ответа не было предоставлено, пришлось ограничиться собственным предположением, коим поделюсь позже.. Интересно было бы взглянуть на ваши догадки.
Код
int f(int a[], int b, int c)
{
    for ( int i = 1; --i + b > 0; )
        if( !( c ^ a[~i + 1]) )
            for( ; i-- + b; )
                if( !( c ^a[~i + 1]) )
                    return -i; 

    return -1;
}

Автор: Dray 28.8.2007, 15:44
За такие функции надо руки отрывать

Автор: Lazin 28.8.2007, 15:52
ф-я ищет в массиве a из b элементов значение c и возвращает его индекс, иначе -1

Автор: Freak_FB 28.8.2007, 16:05
Код проанализирован, и вот что получается:
Функция определяет второе вхождение значения, заданного параметром c, в массив, заданный параметром a. Параметром b целесообразно обозначить размер этого массива минус 1.

Автор: Solomon 28.8.2007, 16:08
Цитата(Freak_FB @  28.8.2007,  15:05 Найти цитируемый пост)
Параметром b целесообразно обозначить размер этого массива минус 1.

всмысле -1.. что задать размер отриц числом???

Автор: FiMa1 28.8.2007, 16:10
Цитата(Lazin @ 28.8.2007,  15:52)
ф-я ищет в массиве a из b элементов значение c и возвращает его индекс, иначе -1

Код
#include <iostream>
using namespace std;

int f(int a[], int b, int c)
{
    for ( int i = 1; --i + b > 0; )
        if( !( c ^ a[~i + 1]) )
            for( ; i-- + b; )
                if( !( c ^a[~i + 1]) )
                    return -i; 

    return -1;
}

void main()
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7 };

    // найти значение 1 в массиве a
    int res = f(a, (sizeof(a) / sizeof(a[0])) - 1, 1);

    if( res != -1)
        cout << res << endl;
    else
        cout << "not found\n";
}

Результат: not found...

Добавлено через 2 минуты и 44 секунды
Цитата(Freak_FB @ 28.8.2007,  16:05)
Код проанализирован, и вот что получается:
Функция определяет второе вхождение значения, заданного параметром c, в массив, заданный параметром a. Параметром b целесообразно обозначить размер этого массива минус 1.

Freak_FB, садитесь - 5! И +1 в репу!

Автор: Lazin 28.8.2007, 16:13
Цитата

Параметром b целесообразно обозначить размер этого массива минус 1. 

b - просто размер массива, так как в выражении --i + b > 0 сначала выполнится декримент, а потом сложение и сравнение, про второй элемент согласен.

Автор: Fazil6 28.8.2007, 16:15
Цитата(FiMa1 @  28.8.2007,  15:19 Найти цитируемый пост)
Что делает приведенная ниже функция, для чего можно ее использовать? С какими значениями параметров целесообразно вызывать функцию, для чего предназначен каждый из параметров?

ну если тут не наличествует отсутствие вообще всякого смысла, то похоже на поиск в массиве a размером b каких-то повторяющихся значений с
а вообще согласен с 
Цитата(Dray @  28.8.2007,  15:44 Найти цитируемый пост)
За такие функции надо руки отрывать
причем по жопу

Автор: FiMa1 28.8.2007, 16:19
Цитата
За такие функции надо руки отрывать, причем по жопу

Будьте внимательны: оторвав руки по самую жопу слушателю на собеседовании, вы можете не получить желаемой работы  smile ! Всем спасибо!

Автор: JackYF 28.8.2007, 16:54
Цитата(FiMa1 @  28.8.2007,  16:19 Найти цитируемый пост)
Будьте внимательны: оторвав руки по самую жопу слушателю на собеседовании, вы можете не получить желаемой работы  smile ! Всем спасибо! 

имхо, для начала следует заявить, что функция не выдерживает критики по параметру понятности и т.д. А потом поинтересоваться - "мне точно сейчас разбирать эту лабуду?"

Автор: Rockie 28.8.2007, 17:11
Цитата(FiMa1 @  28.8.2007,  16:19 Найти цитируемый пост)
Будьте внимательны: оторвав руки по самую жопу слушателю на собеседовании, вы можете не получить желаемой работы

Желаемая работа, как я понимаю - это программы делать, а не http://en.wikipedia.org/wiki/Brainfuck разгадывать smile

Цитата(FiMa1 @  28.8.2007,  15:19 Найти цитируемый пост)
Очередная, небольшая задачка, заданная в г. N госпоже N на собеседовании

А работодатель с юморком smile


Автор: Любитель 29.8.2007, 22:46
Скажем НЕТ извращенцам!!!

Автор: Fazil6 29.8.2007, 22:51
Цитата(Любитель @  29.8.2007,  22:46 Найти цитируемый пост)
Скажем НЕТизвращенцем!!!

читал... 
много думал... 

Так и не решл где тут очепятка...

Автор: Любитель 29.8.2007, 23:21
Теперь пойдёт? smile

Автор: zkv 29.8.2007, 23:41
FiMa1, интересно, а сколько времени давали? 
Цитата(Dray @  28.8.2007,  15:44 Найти цитируемый пост)
За такие функции надо руки отрывать

согласен, при практическом применении.
Но рискну утверждать, что для собеседования задание может считаться вполне приемлимым. 
В конце-концов, возможно, это задание шло на правах "повышенной сложности", и было не обязательным для решения.

Автор: Любитель 29.8.2007, 23:54
Цитата(zkv @  29.8.2007,  23:41 Найти цитируемый пост)
Но рискну утверждать, что для собеседования задание может считаться вполне приемлимым

А я так не считаю. Для вопроса в универе как раз нормально - многие преподя любят спрашивать подобную чушь, а вот при собеседование при приёме на работу - ни в коем случае.

Автор: zkv 30.8.2007, 00:19
Любитель, я думаю хороший тест должен быть составлен так, чтобы никто не мог выбить максимальный балл.
Должны быть простые вопросы, сложные, и почти нерешаемые. 
Ты ведь не станешь жаловаться на то, что в тестах на IQ некоторые вопросы слишком сложные?
Если присутствовать только простые вопросы будут, то по какому принципу отсеивать кандидатов?
Конкретно этот решенный вопрос будет свидетельствовать о способности кандидата разбирать чужой код, 
если справится с этим чудовищем, то со всем остальным и подавно.
Мой итог: вопрос имеет право на жизнь, при правильной оценки работодателем решения кандидата.

Автор: FiMa1 30.8.2007, 08:47
Цитата(zkv @ 29.8.2007,  23:41)
FiMa1, интересно, а сколько времени давали? 
Но рискну утверждать, что для собеседования задание может считаться вполне приемлимым. 
В конце-концов, возможно, это задание шло на правах "повышенной сложности", и было не обязательным для решения.

То, что за такие функции в практике надо руки отрывать - неоспоримый факт, но, в рамках собеседования, задача, имхо, имеет право на существование.
1. Проверка первой реакции человека на предложенную задачу - первое что хочется сделать, это действительно оторвать руки собеседника и отойти в сторону, но с какой стороны это охарактеризует вас для работодателя?
2. Проверка способностей к разбору чужого кода + знание побитовых операций, префиксного, постфиксного декрементов в целом...
На вопрос сколько было дано времени на решение - думаю около 15 минут, вряд ли больше... В любом, случае, мое мнение таково - хватать ручку, бумагу, задавать входные значения и анализировать, анализировать (Freak_FB, насколько я понимаю, анализировал под дебагерром). Лучше анализировать вслух, тогда, если не хватит времени, будет видно, что все усилия были приложены. В конце концов, я думаю, zkv был прав насчет того, что задание было не обязательным для решения.
Вообще, забавно, что вы заговорили о самом собеседовании.. Вот вам еще задачка, заданная там же:
Есть некий класс A, где-то в программе создан указатель на этот класс и объект типа данного класса. Как реализован класс, что будет ошибка компиляции, в строке обозначенной в коде ниже. Что это за ошибка? Каково тело класса? Подсказка: вопрос связан с областью видимости переменных.
Старайтесь провести анализ без использования компилятора для моделирования реальных условий  smile !
Код
class A
{
    // ... какое-то тело
};

int main()
{
    A *p;
    A obj; // здесь возникнет ошибка компиляции

    return 0;
}

Автор: zkv 30.8.2007, 08:59
Цитата(FiMa1 @  30.8.2007,  08:47 Найти цитируемый пост)
Подсказка: вопрос связан с областью видимости переменных.

у меня не связано smile
Код

class A
{
  A(){}
};

Автор: Shaggie 30.8.2007, 09:00
есть конструктор с параметрами и нет конструктора без параметров.

Автор: FiMa1 30.8.2007, 09:03
Цитата(Shaggie @ 30.8.2007,  09:00)
есть конструктор с параметрами и нет конструктора без параметров.

Это первое что я сказал, но ВОПРОС СВЯЗАН С ОБЛАСТЬЮ ВИДИМОСТИ ПЕРЕМЕННЫХ, ответили мне   smile (здесь изменено для моделирования ситуации)...

Добавлено @ 09:06
Цитата(zkv @ 30.8.2007,  08:59)
Цитата(FiMa1 @  30.8.2007,  08:47 Найти цитируемый пост)
Подсказка: вопрос связан с областью видимости переменных.

у меня не связано smile
Код

class A
{
  A(){}
};

Что имел в виду?

Автор: zkv 30.8.2007, 09:12
Цитата(FiMa1 @  30.8.2007,  09:03 Найти цитируемый пост)
Что имел в виду?

что такой код выдаст именно такую ошибку, что и требовалось smile
Код

class A
{
  A(){}
};
int main()
{
    A *p;
    A obj; // здесь возникнет ошибка компиляции
    return 0;
}

Автор: FiMa1 30.8.2007, 09:17
Цитата(zkv @ 30.8.2007,  09:12)
что такой код выдаст именно такую ошибку, что и требовалось

Ладно не будем тянуть кота за х..., zkv - пять баллов, ты прав и успешно принят на работу  smile ! Я не сомневаюсь, что ты знаешь о чем говоришь, но не мог бы раскрыть чуть более подробнее для последователей...

Автор: zkv 30.8.2007, 09:22
Цитата(FiMa1 @  30.8.2007,  09:17 Найти цитируемый пост)
zkv - пять баллов, ты прав,

дык у меня решение не связано с областью видимости.

все просто, по умолчанию все члены класса закрытые, можно было явно написать private: или protected: перед конструктором, только не так интересно будет smile
ну а дальше ясно - указатель он и в африке указатель, он и на абстрактный тип может быть, для него конструктор не нужен
а вот для объекта вызывается конструктор умолчания, а он закрыт, вот компилятор и сообщает: "ты определись давай!"

Автор: FiMa1 30.8.2007, 09:28
Цитата(zkv @ 30.8.2007,  09:22)
дык у меня решение не связано с областью видимости.
все просто, по умолчанию все члены класса закрытые, можно было явно написать private: или protected: перед конструктором, только не так интересно будет smile
ну а дальше ясно - указатель он и в африке указатель, он и на абстрактный тип может быть, для него конструктор не нужен
а вот для объекта вызывается конструктор умолчания, а он закрыт, вот компилятор и сообщает: "ты определись давай!"

 smile  тогда ставим слушателям на собеседовании не зачет, потому что однозначно убеждали, что cannot access private member declared in class 'A', в данном случае связана с областью видимости, т.к., в их случае деструктор, закрыт... Меж тем, может быть правда на их стороне и данная ситуация подпадает под понятие области видимости...

Автор: zkv 30.8.2007, 09:34
FiMa1, я под областью видимости привык понимать следующее:
Код

{
  int a;
//начало области видимости a
...
//конец области видимости a
}

а то о чем шла речь выше - это модификаторы доступа.
Может где-нибудь принято называть по другому.

Автор: UnrealMan 30.8.2007, 10:08
Цитата(FiMa1 @  30.8.2007,  09:28 Найти цитируемый пост)
тогда ставим слушателям на собеседовании не зачет, потому что однозначно убеждали, что cannot access private member declared in class 'A', в данном случае связана с областью видимости

Это каким надо быть извращенцем, чтобы accessibility перевести на русский как область видимости. В топку таких работодателей. Лучше не иметь с ними никаких дел.

Автор: FiMa1 30.8.2007, 10:21
Цитата(UnrealMan @ 30.8.2007,  10:08)
Это каким надо быть извращенцем, чтобы accessibility перевести на русский как область видимости. В топку таких работодателей.

О переводе речь не ведется, cannot access private member declared in class 'A' - копипаст трактования ошибки студией..
Насколько я понял, само то, что закрытые классом конструктор/деструктор невидимы (а по моему, лучше недоступны) на данном участке программы (Керниган: область видимости - участок программы, где это имя известно), подгоняли под понятие области видимости.
Пробежался по стандарту - в разделе Declarative regions and scopes ничего про данный взгляд на область видимости не нашел...

Автор: UnrealMan 30.8.2007, 10:43
Цитата(FiMa1 @  30.8.2007,  10:21 Найти цитируемый пост)
Насколько я понял, само то, что закрытые классом конструктор/деструктор невидимы (а по моему, лучше недоступны) 

Видимость и доступность – совсем разные вещи. Давай посмотрим на такой пример:

Код
struct A
{
    void f(double) {}
private:
    void f(int) {}
};

int main()
{
    A().f(0.); // OK
    A().f(0);  // error
}

При разрешении перегрузки метод void f(int) видим, но для вызова он не доступен. Поэтому в первом случае, когда разрешение перегрузки оказывается в пользу вызова открытой функции, проблем не возникает, когда же оно оказывается в пользу вызова закрытой функции, возникает ошибка.

Цитата(FiMa1 @  30.8.2007,  10:21 Найти цитируемый пост)
Пробежался по стандарту - в разделе Declarative regions and scopes ничего про данный взгляд на область видимости не нашел...

Цитата(ISO/IEC 14­882:2003(E) §3.3 Declarative regions and scopes)
In general, each particular name is valid only within some possibly discontiguous portion of program text called its scope.

Вот scope – это и есть область видимости.

Автор: FiMa1 30.8.2007, 10:50
Цитата(UnrealMan @ 30.8.2007,  10:43)
Видимость и доступность – совсем разные вещи.

По-моему из моей фразы:
Цитата
Насколько я понял, само то, что закрытые классом конструктор/деструктор невидимы (а по моему, лучше недоступны)
 видно, что я осознаю эту разницу и, разумеется, согласен с тем, что ты говоришь..
Цитата
Вот scope – это и есть область видимости.

Спасибо  smile, но это мне тоже было известно...

Автор: UnrealMan 30.8.2007, 11:58
Цитата(FiMa1 @  30.8.2007,  10:50 Найти цитируемый пост)
но это мне тоже было известно... 

А что ты тогда искал в пункте 3.3? Про accessibility там, естественно, ничего нет; вопросы доступности рассматриваются в главе 11 Member access control.

Автор: Mayk 30.8.2007, 19:02
Цитата(FiMa1 @  30.8.2007,  12:47 Найти цитируемый пост)

2. Проверка способностей к разбору чужого кода + знание побитовых операций, префиксного, постфиксного декрементов в целом...

Как знание префиксных/постфиксных она отдалена от реальности.  
Разбор
Код

for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++ )

vs
Код

for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it )

принесёт гораздо больше полезной информации. 

Цитата(FiMa1 @  30.8.2007,  12:47 Найти цитируемый пост)
class A
{
    // ... какое-то тело
};
int main()
{
    A *p;
    A obj; // здесь возникнет ошибка компиляции
    return 0;
}

вот ешё один изуверский способ завалить в A obj. Правда выходим за рамки тела класса. Но совсем чуть чуть.
Код

class A
{
    public:
    void operator* ( A p ){}
}A,p;

int main()
{
    A* p; // валидно.  вызывает op* для переменных A и p.
    A obj; // ерунда
}

Автор: jurgal 31.8.2007, 10:20
Код

!( c ^ a[~i + 1])


какую функцию выполняют ^ и тильда перед i ? 

Автор: UnrealMan 31.8.2007, 10:21
Кстати, могу подкинуть одну простенькую задачку. Есть код

Код
#include <iostream>

template <class T>
    void f(const T &t)
        { std::cout << "template" << std::endl; }

void f(...)
        { std::cout << "ellipsis" << std::endl; }
        
/* ... */

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

Что нужно вставить вместо /* ... */, чтобы вывелось "ellipsis"? Макросы и комментарии использовать запрещается. Вводить новую перегруженную функцию f тоже.

Автор: FiMa1 31.8.2007, 10:53
Код
#include <iostream>
using namespace std;

template <class T> void f(const T &t)
{
    cout << "template" << endl;
}

void f(...)
{
    cout << "ellipsis" << endl;
}


void f(int x, ...)
{
    cout << "ellipsis" << endl;
}

int main()
{
    int x = 10;

    f(x); // должно быть выведено: "ellipsis"
}

Автор: UnrealMan 31.8.2007, 11:02
Я немного усложнил требование: вводить новую перегруженную f нельзя.

Автор: FiMa1 31.8.2007, 11:05
Цитата(UnrealMan @ 31.8.2007,  11:02)
Я немного усложнил требование: вводить новую перегруженную f нельзя.

А x обязательно в качестве аргумента передавать, его ведь можно и убрать f();  smile 
А, ну да, ведь нужно добавить некий кусочек, ну тогда как вариант...

Автор: UnrealMan 31.8.2007, 11:06
Обязательно. Иначе смысл задачи теряется.

Добавлено @ 11:08
Можно лишь заменять /* ... */ на какой-то код. Править существующий код или добавлять код куда-то ещё не допускается.

Автор: FiMa1 31.8.2007, 11:27
Код
#include <iostream>
using namespace std;

template <class T> void f(const T &t)
{
    cout << "template" << endl;
}

void f(...)
{
    cout << "ellipsis" << endl;
}

void (&x)(...) = f;

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

Автор: UnrealMan 31.8.2007, 11:43
Ссылка на функцию будет передана шаблонной функции, которая выведет "template" smile

Автор: FiMa1 31.8.2007, 11:45
Цитата(UnrealMan @ 31.8.2007,  11:43)
Ссылка на функцию будет передана шаблонной функции, которая выведет "template" smile

Компилировал?

Автор: bsa 31.8.2007, 11:57
Цитата(FiMa1 @ 31.8.2007,  11:45)
Цитата(UnrealMan @ 31.8.2007,  11:43)
Ссылка на функцию будет передана шаблонной функции, которая выведет "template" smile

Компилировал?

gcc 4.1.2 выдает "template"

Автор: FiMa1 31.8.2007, 12:04
Код

#include <iostream>
using namespace std;

template <class T> void f(const T &t)
{
    cout << "template" << endl;
}

void f(...)
{
    cout << "ellipsis" << endl;
}

void x(){}

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

Автор: bsa 31.8.2007, 12:06
FiMa1 ты хоть проверяешь?

Вот еще вариант, но немного "читерский" smile
Код
#include <iostream>

template <class T>
    void f(const T &t)
        { std::cout << "template" << std::endl; }

void f(...)
        { std::cout << "ellipsis" << std::endl; }

#include <unistd.h>
struct s
{
       s() { f(0,0); ::close(1); }
} x;

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

Автор: FiMa1 31.8.2007, 12:06
Цитата(bsa @ 31.8.2007,  11:57)
Цитата(FiMa1 @ 31.8.2007,  11:45)
Цитата(UnrealMan @ 31.8.2007,  11:43)
Ссылка на функцию будет передана шаблонной функции, которая выведет "template" smile

Компилировал?

gcc 4.1.2 выдает "template"

 smile  У меня Visual Studio 2005 Professional Edition... Сам недоумеваю над результатом. У кого еще аналогичный компилятор, перепроверьте, плз.. Просто очень интересно, это что бага студии..
Код
#include <iostream>
using namespace std;

template <class T> void f(const T &t)
{
    cout << "template" << endl;
}

void f(...)
{
    cout << "ellipsis" << endl;
}

void (&x)(...) = f;
void (*x_)(...) = f;

int main()
{
    f(x);  // печатает "ellipsis"
    f(x_); // печатает "template" 
}

Автор: UnrealMan 31.8.2007, 12:08
x будет передана как ссылка на функцию

Автор: FiMa1 31.8.2007, 12:09
Цитата(UnrealMan @ 31.8.2007,  12:08)
будет то же самое smile

По поводу? Так не правильно дописать что ли void x(){} ?

Автор: UnrealMan 31.8.2007, 12:17
Я, кстати, не видел в стандарте разрешения использовать указатели и ссылки на функции-эллипсисы.

Автор: Fazil6 31.8.2007, 12:20
ну и запрета там походу тоже нет

FiMa1, специально проверил твой последний вариант.

Microsoft Visual Studio 2005
Version 8.0.50727.762  (SP.050727-7600)
Microsoft .NET Framework
Version 2.0.50727

шаблон в обоих случаях вызвался 

Автор: UnrealMan 31.8.2007, 12:22
Что не разрешено, то запрещено.

Автор: FiMa1 31.8.2007, 12:23
Цитата(UnrealMan @ 31.8.2007,  12:17)
Я, кстати, не видел в стандарте разрешения использовать указатели и ссылки на функции-эллипсисы.

Ну а тот вариант где сам x - функция?
Код
...
void x(){}

int main()
{
    f(x);
...
}

Автор: UnrealMan 31.8.2007, 12:26
x будет передана ссылкой на функцию в шаблонную функцию

Автор: FiMa1 31.8.2007, 12:27
Цитата(Fazil6 @ 31.8.2007,  12:20)
FiMa1, специально проверил твой последний вариант.
Microsoft Visual Studio 2005
Version 8.0.50727.762  (SP.050727-7600)
Microsoft .NET Framework
Version 2.0.50727
шаблон в обоих случаях вызвался

 smile не знаю.. перестроил проект (Empty Console Project), Microsoft Visual Studio 2005, Version 8.0.50727.42  (RTM.050727-4200), Installed Edition: Professional - то же самое (ellipsis, template)...
Но здравая логика, говорит, что компилятор возможно не прав..

Автор: UnrealMan 31.8.2007, 12:32
Если стандарт никак не огововаривает поведение ссылок на функции с эллипсисами, то тут не о чем говорить. Результат может быть любой.

Автор: bns 31.8.2007, 12:38
у меня в VS2005
Код


template <class T>
    void f(const T &t)
        { std::cout << "template" << std::endl; }
void f(...)
        { std::cout << "ellipsis" << std::endl; }
        
void (&x)(...) = f;

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}



выдает ellipsis

Автор: UnrealMan 31.8.2007, 13:33
Задачка элементарная, и у неё есть вполне стандартное решение. Вставить надо всего одну простую строчку кода. Даже короче, чем void x(){} smile

Автор: bsa 31.8.2007, 14:08
Код
#include <iostream>

template <class T>
    void f(const T &t)
        { std::cout << "template" << std::endl; }

void f(...)
        { std::cout << "ellipsis" << std::endl; }

enum { x = 10};

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

Автор: FiMa1 31.8.2007, 14:11
Цитата(bsa @ 31.8.2007,  14:08)
Код
#include <iostream>

template <class T>
    void f(const T &t)
        { std::cout << "template" << std::endl; }

void f(...)
        { std::cout << "ellipsis" << std::endl; }

enum { x = 10};

int main()
{
    f(x); // должно быть выведено: "ellipsis"
}

у меня "template" выводит  smile 

Автор: UnrealMan 31.8.2007, 14:14
Ну наконец-то smile Всё правильно: локальные и анонимные типы в шаблонах не выводятся.

Так что такие варианты

enum {x};
enum {} x;
class {} x;

всегда будут идти мимо шаблонов

Добавлено через 1 минуту и 7 секунд
Цитата(FiMa1 @  31.8.2007,  15:11 Найти цитируемый пост)
у меня "template" выводит  

Компилятор смени. Стандарт запрещает вывод анонимных типов.

Автор: FiMa1 31.8.2007, 14:22
Цитата(UnrealMan @ 31.8.2007,  14:14)
Компилятор смени. Стандарт запрещает вывод анонимных типов.

Мда уж.. Так же стандарту не соответствует Borland C++ Builder Enterprise Suite Version 6.0 (Build 10.157). Вариант с классом прогонял уже давно, вот ведь гады  smile 
Аналогичная ситуация и для dev-cpp v 4.9.8.0  smile 

Автор: bsa 31.8.2007, 15:22
Вообще-то речь идет про анонимные типы. Т.е. enum X { x = 10; }; - это не анонимный тип

Автор: UnrealMan 1.9.2007, 10:14
Цитата(FiMa1 @  31.8.2007,  15:22 Найти цитируемый пост)
Так же стандарту не соответствует Borland C++ Builder Enterprise Suite Version 6.0

Помнится, у борланда вообще какие-то странности с enum-ами были. Попробуй в нём скомпилировать такой код

Код

#include <iostream>
#include <ostream>

enum En { zero };

void f(...) { std::cout << "f(...)" << std::endl; }
void f(int *) { std::cout << "f(int *)" << std::endl; }

int main()
{
    f(zero);
    f(zero * 0);
    f(1-1);
}

Что вывелось на экран?

Автор: Любитель 1.9.2007, 15:30
 smile 
Цитата(UnrealMan @  1.9.2007,  10:14 Найти цитируемый пост)
#include <ostream>

Зачем?

Автор: UnrealMan 1.9.2007, 17:13
Цитата(Любитель @  1.9.2007,  16:30 Найти цитируемый пост)
Зачем? 

Для std::endl smile

Автор: bsa 1.9.2007, 20:00
Цитата(UnrealMan @ 1.9.2007,  17:13)
Цитата(Любитель @  1.9.2007,  16:30 Найти цитируемый пост)
Зачем? 

Для std::endl smile

iostream сам подключает ostream и istream.

Автор: Mayk 1.9.2007, 21:40
Цитата(bsa @  2.9.2007,  00:00 Найти цитируемый пост)

iostream сам подключает ostream и istream.

Формально говоря, если это и следует из текущего стандарта, то очень уж не явно. 

Автор: bsa 1.9.2007, 21:45
а разве std::cout, std::cerr и std::cin не экземпляры потомков соответствующих классов?

Автор: UnrealMan 1.9.2007, 22:13
Цитата(bsa @  1.9.2007,  21:00 Найти цитируемый пост)
iostream сам подключает ostream и istream. 

Это естественная, но необязательная реализация smile

Автор: Mayk 1.9.2007, 22:21
Цитата(bsa @  2.9.2007,  01:45 Найти цитируемый пост)
а разве std::cout, std::cerr и std::cin не экземпляры потомков соответствующих классов? 

Код

//     Header <iostream> synopsis

           namespace std {
             extern istream            cin;
             extern ostream            cout;
             extern ostream            cerr;
             extern ostream            clog;

               extern     wistream       wcin;
               extern     wostream       wcout;
               extern     wostream       wcerr;
               extern     wostream       wclog;
           }

вот что говорит стандарт.
Код

           namespace std {
 class istream;
 class ostream;
class wistream;
class wostream;

             extern istream            cin;
             extern ostream            cout;
             extern ostream            cerr;
             extern ostream            clog;

               extern     wistream       wcin;
               extern     wostream       wcout;
               extern     wostream       wcerr;
               extern     wostream       wclog;
           }

Вполне себе собирается. Это во-первых.

Во-вторых. endl не является членом [io]stream'а. Поэтому даже если в iostream определяется ostream, это вовсе не факт что endl в нём  объявлен. 
Цитата(UnrealMan @  2.9.2007,  02:13 Найти цитируемый пост)
Цитата(bsa @  1.9.2007,  21:00 Найти цитируемый пост)
iostream сам подключает ostream и istream. 

Это естественная, но необязательная реализация


Правда, в стандарте есть пример в разделе 27.6.1.3
Код

               #include <iostream> //единтсвенный #include

               int main()
               {
                 using namespace std;
                 const int line_buffer_size = 100;

                   char buffer[line_buffer_size];
                   int line_number = 0;
                   while (cin.getline(buffer, line_buffer_size, '\n') || cin.gcount()) {
                     int count = cin.gcount();
                     if (cin.eof())
                                                          // cin.fail() is false
                       cout << "Partial final line";
                     else if (cin.fail()) {
                       cout << "Partial long line";
                       cin.clear(cin.rdstate() & ~ios::failbit);
                     } else {
                                               // Don't include newline in count
                       count--;
                       cout << "Line " << ++line_number;
                     }
                     cout << " (" << count << " chars): " << buffer << endl; //<<<<<<<<<<<<<<
                   }
               }

из которого можно сделать вывод о том что endl в iostream'е таки подразумевается.
[что любопытно, в примере из раздела 14.6 используется cout << ... << '\n']

Автор: UnrealMan 2.9.2007, 10:04
Цитата(Mayk @  1.9.2007,  23:21 Найти цитируемый пост)
Правда, в стандарте есть пример в разделе 27.6.1.3

Ну, в стандарте много незаконченных примеров smile 

Автор: The Thing 3.9.2007, 14:01
скажите, а что в коде означает символ тильда "~i"?
Код

c ^ a[~i + 1]) 

Автор: Lazin 3.9.2007, 14:38
The Thing, ~ - отрицание, так-как i - отрицательное число, то ~i = abs(i) - 1 
~(-1) = 0
~(-2) = 1 итд
а xor там для сравнения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)