Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.63
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

[C/C++] Смысл многоточия (...) - C++

05.08.2009, 14:40. Просмотров 5560. Ответов 13
Метки нет (Все метки)

Не мог бы кто-нибудь пояснить смысл данного явления в языке C и C++? Гугль конечно приводит в ступор поиск троеточий Я видел использование троеточия в try - catch ,а также в интерфейсе функции int scanf ( const char * format, ... ); Как именно компилятор понимает данную последовательность символов?И вообще,это оператор и есть ли у этого имя.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2009, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C/C++] Смысл многоточия (...) (C++):

Дана строка символов, заменить в ней все многоточия на плюсы - C++
пожалуйста!!!!помогите решить задачу дана строка символов.заменить в ней все многоточия на плюсы срочно.очень нужно!

Вновь строки. Отредактировать заданное предложение, заменяя многоточия точкой - C++
Вот задание: Отредактировать заданное предложение, заменяя многоточия точкой. Помогите пожалуйста, никак разобраться не могу

Указатели в с++ и их смысл - C++
Объясните пожалуйста для чего нужны указатели и что это вообще? я в книжках смотрел по с++ но везде одно и тоже,и я не понимаю. И где эти...

Смысл выражения - C++
В чем смысл выражения x%=(N+1); y%=(M+1);

Смысл обьединений - C++
Обьясните смысл обьединений. Известно, что с их помощью можно помещать обьекты в одной области памяти. Но что дает такая возможность? И...

Смысл выражения x%2 - C++
Здравствуйте. Помогите разобраться с кодом. Я только начинаю изучать C++. Просматриваю примеры кодов из раздела "Задача для лучшего...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.08.2009, 14:43 #2
Многоточие задает переменное число параметров. Посмотри пример здесь Функции в С
mik-a-el
CyberForum Owner
57368 / 37116 / 231
Регистрация: 10.04.2006
Сообщений: 12,684
05.08.2009, 14:43 #3
http://linuxprograms.wordpress.com/2...erator-printf/
http://publib.boulder.ibm.com/infoce...s400clr155.htm
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
05.08.2009, 15:16 #4
Цитата Сообщение от #pragma Посмотреть сообщение
И вообще,это оператор и есть ли у этого имя.
Устоявшиеся названия: "ellipsis", "эллипс", "threedot", "три точки"
Phantom
Эксперт C++
3164 / 846 / 16
Регистрация: 29.12.2008
Сообщений: 952
05.08.2009, 15:32 #5
Б. Страуструп. "Язык программирования С++", глава Функции, Неуказанное количество аргументов:
Для некоторых функций невозможно указать количество и типы всех аргументов. Список аргументов в объявлениях таких функций заканчивается многоточием (...), что означает "и может быть ещё несколько аргументов". Например:
C++
1
int printf(const char* ...);
Это означает, что вызов функции стандартной библиотеки C printf() должен содержать по крайней мере один аргумент типа char* и может либо содержать, либо не содержать ещё несколько аргументов.
Очень подробная глава, как раз по теме, советую почитать.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
05.08.2009, 17:45 #6
http://www.cplusplus.com/reference/c...stdarg/va_arg/
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
06.08.2009, 17:08 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   
 char* s_print_f (char* _dest, char* format,...) {
     char* pdest = _dest;
     char* pt;
     char buffer [10];
     char** ptr = &format;
     char* p = format;
 
     for ( ; *p ; p++) {
 
        if (*p == '%') {
           switch (*(p++ +1)) {
            case 'd':
              ltoa((long) *++ptr, buffer, 10);
               pt = buffer;
              while (*pt) *pdest++ = *pt++;
              break;
 
             case 's':
               pt = *++ptr;
              while (*pt) *pdest++ = *pt++;
             break;
 
             case 'c':
             *pdest++ = (char) *++ptr;
             break;
         }
     }
     else  *pdest++=*p ;
     }
     *pdest = '\0';
     return _dest;
  }
примитивное подобие форматного вывода, но создает общее впечатление о работе функции с переменным числом параметров.
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
06.08.2009, 20:27 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
// приметивная функция нахождения сумы
// первий параметр количество елементов
int sum(int count, ...){
    int s = 0;
    for(int i = 1; i <= count; ++i){
            s += (&count)[i];        
    }
    return s;
}
 
int main(){
    cout << sum(3, 20, 30, 40) << endl;
    system("pause");
    return 0;   
}
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.08.2009, 20:37 #9
DreamWolf, попробуй свой пример на 64-разрядной машине скомпилять. Или на любой другой процессор, отличный от Intel. За такие примеры вообще канделябром надо бить
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
06.08.2009, 21:15 #10
попробуй свой пример на 64-разрядной машине скомпилять.
Никогда не компелировал, а что не работает?
Или на любой другой процессор, отличный от Intel.
Ти имееш ввиду другой компании (тогда работает) или другой архитектури (тогда не знаю)?
За такие примеры вообще канделябром надо бить
Не понял что ти имел ввиду.
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.08.2009, 22:42 #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
> Не понял что ти имел ввиду

Ты написал некорректный код. Кто тебе сказал, что второй параметр после count лежит в памяти и кто сказал, что он лежит в памяти впритык за count? По программным соглашениям на архитектуре параметры могут передаваться на регистрах, а все эти знания и заключены в макросе va_arg, который на каждой архитектуре имеет свою реализацию
Phantom
Эксперт C++
3164 / 846 / 16
Регистрация: 29.12.2008
Сообщений: 952
06.08.2009, 23:07 #12
DreamWolf, я бы вот так твой пример переписал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdarg.h>
using namespace std;
 
// приметивная функция нахождения сумы
// первий параметр количество елементов
int sum(int count,...)
{
    va_list ap;
    int s = 0;
    va_start(ap,count);
    for(int i=0;i<count;i++) s+=va_arg(ap,int);
    va_end(ap);
    return s;
}
 
int main()
{
    cout << sum(3, 20, 30, 40) << endl;
    system("pause");
    return 0;   
}
Evg, правильно говорит, нужно макрос va_arg использовать.

Вот как раз в тему: информация про эти макросы.
http://msdn.microsoft.com/en-us/libr...d8(VS.71).aspx
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
07.08.2009, 00:36 #13
#pragma,
в VC++ с версии 8.0 и gcc c 4-какой-то позволяют использовать троеточние в макросах. это означает, что туда можно передать переменной число параметров.

например:
C++
1
2
3
4
5
#ifdef _DEBUG
#define dprintf(fmt, ...) printf(fmt, __VA_ARG__)
#else
#define dprintf(fmt, ...) ((void) 0)
#endif
использование - так же как и printf:
dprintf("%s %d", "Hello", 123);

без такой поддержки раньше обычно обходились извратами

C++
1
2
3
4
5
6
7
#ifdef _DEBUG
#define dprintf(args) printf args
#else
#define dprintf(args) ((void) 0)
#endif
 
dprintf(("%s %d", "Hello", 123));
с новом стандарте C++0x обещают прикрутить поддержку многоточия в шаблонах.
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
07.08.2009, 08:38 #14
Цитата Сообщение от Rififi Посмотреть сообщение
и gcc c 4-какой-то
В gcc ещё версии 2.95 была поддержка трёх точек в макросах. Но я бы не стал этим злоупотреблять без великой необходимости, если программа будет переносится на другие компиляторы. Тот же самый dprintf я бы реализовал в виде функции с пустым телом в режиме без отладки. Немного лишнего кода в боевой версии, но меньше проблем с переносимостью
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2009, 08:38
Привет! Вот еще темы с ответами:

Есть ли смысл в блоках? - C++
Есть ли смысл в таких блоках? #include &lt;iostream&gt; #include &lt;string&gt; int main() { setlocale(0, &quot;&quot;); { const std::string...

Физический смысл паттернов - C++
В чем состоится физический смысл паттернов, где найти литературу на эту тему?

Есть ли смысл в изучении C++ - C++
Есть ли смысл учить C++ без знаний С ? Все равно ведь придется учить С даже если ты вдоль изучишь С++ если ты новичок в этом деле....

Смысл спецификатора mutable - C++
В этом тема и заключается %-)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.08.2009, 08:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru