Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/36: Рейтинг темы: голосов - 36, средняя оценка - 4.81
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 924
#1

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

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

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

Отредактировать заданное предложение, заменяя многоточия точкой
Товарищи. Требуется помощь. Вот само условие. Напишите прогу, буду благодарен....

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

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

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

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

13
Gravity
569 / 563 / 64
Регистрация: 29.01.2009
Сообщений: 1,274
05.08.2009, 14:43 #2
Многоточие задает переменное число параметров. Посмотри пример здесь Функции в С
1
mik-a-el
Администратор
71715 / 40989 / 241
Регистрация: 10.04.2006
Сообщений: 12,724
05.08.2009, 14:43 #3
http://linuxprograms.wordpress.com/2...erator-printf/
http://publib.boulder.ibm.com/infoce...s400clr155.htm
1
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
05.08.2009, 15:16 #4
Цитата Сообщение от #pragma Посмотреть сообщение
И вообще,это оператор и есть ли у этого имя.
Устоявшиеся названия: "ellipsis", "эллипс", "threedot", "три точки"
1
Phantom
Эксперт С++
3170 / 852 / 39
Регистрация: 29.12.2008
Сообщений: 952
05.08.2009, 15:32 #5
Б. Страуструп. "Язык программирования С++", глава Функции, Неуказанное количество аргументов:
Для некоторых функций невозможно указать количество и типы всех аргументов. Список аргументов в объявлениях таких функций заканчивается многоточием (...), что означает "и может быть ещё несколько аргументов". Например:
C++
1
int printf(const char* ...);
Это означает, что вызов функции стандартной библиотеки C printf() должен содержать по крайней мере один аргумент типа char* и может либо содержать, либо не содержать ещё несколько аргументов.
Очень подробная глава, как раз по теме, советую почитать.
1
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
05.08.2009, 17:45 #6
http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/
1
Фенрир
42 / 38 / 12
Регистрация: 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;
  }
примитивное подобие форматного вывода, но создает общее впечатление о работе функции с переменным числом параметров.
1
mustardandrew
Человек
96 / 80 / 7
Регистрация: 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;   
}
1
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
06.08.2009, 20:37 #9
DreamWolf, попробуй свой пример на 64-разрядной машине скомпилять. Или на любой другой процессор, отличный от Intel. За такие примеры вообще канделябром надо бить
1
mustardandrew
Человек
96 / 80 / 7
Регистрация: 16.06.2009
Сообщений: 229
06.08.2009, 21:15 #10
попробуй свой пример на 64-разрядной машине скомпилять.
Никогда не компелировал, а что не работает?
Или на любой другой процессор, отличный от Intel.
Ти имееш ввиду другой компании (тогда работает) или другой архитектури (тогда не знаю)?
За такие примеры вообще канделябром надо бить
Не понял что ти имел ввиду.
0
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
06.08.2009, 22:42 #11
Лучший ответ Сообщение было отмечено как решение

Решение

> Не понял что ти имел ввиду

Ты написал некорректный код. Кто тебе сказал, что второй параметр после count лежит в памяти и кто сказал, что он лежит в памяти впритык за count? По программным соглашениям на архитектуре параметры могут передаваться на регистрах, а все эти знания и заключены в макросе va_arg, который на каждой архитектуре имеет свою реализацию
3
Phantom
Эксперт С++
3170 / 852 / 39
Регистрация: 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/library/kb57fad8(VS.71).aspx
2
Rififi
2363 / 1056 / 104
Регистрация: 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 обещают прикрутить поддержку многоточия в шаблонах.
1
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
07.08.2009, 08:38 #14
Цитата Сообщение от Rififi Посмотреть сообщение
и gcc c 4-какой-то
В gcc ещё версии 2.95 была поддержка трёх точек в макросах. Но я бы не стал этим злоупотреблять без великой необходимости, если программа будет переносится на другие компиляторы. Тот же самый dprintf я бы реализовал в виде функции с пустым телом в режиме без отладки. Немного лишнего кода в боевой версии, но меньше проблем с переносимостью
1
07.08.2009, 08:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2009, 08:38

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

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

Смысл директивы using
Директива using &quot;поднимает&quot; имена всех членов указанного namespace'а в текущий...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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