Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
1

Что? (оператор "," (запятая))

09.05.2013, 23:01. Показов 6555. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется часть кода, взятого из Википедии.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double *alpha = new double[n - 1];
        double *beta = new double[n - 1];
        double A, B, C, F, h_i, h_i1, z;
        alpha[0] = beta[0] = 0.;
        for (std::size_t i = 1; i < n - 1; ++i)
        {
                h_i = x[i] - x[i - 1], h_i1 = x[i + 1] - x[i];
                A = h_i;
                C = 2. * (h_i + h_i1);
                B = h_i1;
                F = 6. * ((y[i + 1] - y[i]) / h_i1 - (y[i] - y[i - 1]) / h_i);
                z = (A * alpha[i - 1] + C);
                alpha[i] = -B / z;
                beta[i] = (F - A * beta[i - 1]) / z;
        }
Меня заинтересовала строчка
C++
1
h_i = x[i] - x[i - 1], h_i1 = x[i + 1] - x[i];
Неужели через запятую можно писать? И в каких случаях такое можно делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2013, 23:01
Ответы с готовыми решениями:

Оператор запятая
почему тут выдает ошибку на endl cout &lt;&lt; 666,666 &lt;&lt; endl;

Оператор запятая
int I, j; j=10; i = (j++, j+100, 999+j); почему выведет 1010 а не 1110?

Оператор запятая в return и задача
Всем ДВС! Разъясните пожалуйста, почему тимус принимает #include &lt;cstdio&gt; #include &lt;cstdlib&gt;...

Оператор "запятая" внутри условия if(a>0, b>0)
Почему ЭТО не является ошибкой? if(a&gt;0 , b&gt;0) { cout &lt;&lt; &quot;1&quot;; } Что делает запятая?

Нюансы использования оператора запятая или что такое UB и с чем его едят
Почему студия и ideone выдают разные значения для a и b? в студии выходит a = 10 , b = 10 в...

34
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.05.2013, 23:20 2
Запятая - последовательное выполнение. Приоритет самый низкий. Используется так же, как и другие операторы: например
C++
1
2
3
4
a = b, c = d;
for (int q = 1; a = b, c = d; e = f, true);
f(1, 2); // 2 параметра
f((1, 2)); // 1 параметр: f(2)
но не
C++
1
if (...) ..., if (...) ...; // *** тут уже не одно выражение
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
09.05.2013, 23:21 3
C++
1
2
3
4
int main()
{
  int A=6,B=8;
}
1
metaluga145
09.05.2013, 23:26  [ТС]
  #4

Не по теме:

Действительно. Что-то я под вечер плохо соображаю :(

0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
09.05.2013, 23:30 5
По-моему, нельзя ставить запятую перед ключевыми словами.
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.05.2013, 23:40 6
Цитата Сообщение от daslex Посмотреть сообщение
C++
1
2
3
4
int main()
{
  int A=6,B=8;
}
Это другой случай... Тут объявление и инициализация.
C++
1
2
3
4
int main()
{
  int A=(6,B=8);
}
А тут вот последовательное выполнение, только без особого смысла.
0
daslex
09.05.2013, 23:43
  #7

Не по теме:

тама вопрос выше написан И в каких случаях такое можно делать?, я поэтому

0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.05.2013, 23:47 8
Цитата Сообщение от FreeMan108 Посмотреть сообщение
По-моему, нельзя ставить запятую перед ключевыми словами.
C++
1
new int, new int;
Цитата Сообщение от daslex Посмотреть сообщение
тама вопрос выше написан И в каких случаях такое можно делать?
Так это уже не "такое", а другое.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
10.05.2013, 00:08 9
Не вижу особой разницы между тем, что я написал и например первоначальным и нижним кодом
C++
1
2
3
4
for 
        {
                h_i = x[i] - x[i - 1], h_i1 = x[i + 1] - x[i];             
        }

C++
1
2
3
4
5
6
int x,y;
 
for (int i=0;i<10;i++)
{
x=i,y=i+6;
}
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.05.2013, 20:12 10
daslex, разница есть. Она заключается в том, что для синтаксического анализатора это два разных случая, два правила, которые порождают разные машинные инструкции (в примере с объявлением через запятую используется не оператор "запятая", а обычное перечисление). Третий вариант, где можно использовать запятую - при вызове функции, перечисляя её аргументы, но это также совершенно другой вариант запятой, не имеющий никакого отношения к оператору "запятая". К слову, оператор "запятая" можно перегрузить для собственного типа данных, но эта перегрузка не будет иметь никакого значения при объявлении и при вызове функций.
1
daslex
13.05.2013, 20:20
  #11

Не по теме:

silent_1991, да мне уже объяснили

0
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
20.07.2013, 10:44 12
Есть такой кусок кода
C++
1
(a<0) ? (b= false, cout << "false == b. Cycle's terminated.") : (b = true)
Выдает ошибку - но здесь я так понимаю запятая - это операция - вычисляется cout, а затем это значение не может преобразоваться в int(ну а оттуда в bool)
Я думал сделать так -
C++
1
(a<0) ? b= false, cout << "false == b. Cycle's terminated." : (b = true)
- так как здесь запятая это вроде бы точка следования (скобок нет, а в операторе ?: заяптая это точка следования)- та же ошибка.
Я знаю что запятые лучше не использовать - "одно действие в программе од*на строчка кода"
Но все таки интересно что здесь не так
C++
1
(cout << "The input've terminated", b = false )
- Так работает, хотя b = false и должно false cout-у присвоить?

Добавлено через 20 минут
Cейчас бегло просмотрел стандарт 11 - там вообще микропункт который очень мало объясняет
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
20.07.2013, 10:53 13
Оператор запятая последовательно выполняет операнды и возвращает значение правого операнда.
0
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
20.07.2013, 11:11 14
Да, я это читал - и куда возвращает тогда значение
C++
1
cout << "false == b. Cycle's terminated."
Там же нет до этого а = (? : )
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
20.07.2013, 11:18 15
Цитата Сообщение от Aliru Посмотреть сообщение
и куда возвращает тогда значение
а так:
C++
1
2
3
int main(){
   std::cout<<"Hello world";
}
куда возвращает значение?

Добавлено через 1 минуту
Цитата Сообщение от Aliru Посмотреть сообщение
а затем это значение не может преобразоваться в int(ну а оттуда в bool)
Зато может преобразоваться в void* ну или сразу в bool в C++11
0
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
20.07.2013, 11:27 16
Я думаю что это возвращает true в объект cout - ну или что-то наподобии. Как если вместо числа ввести строку то необходимо будет снимаь флаг ошибки - но честно это предположене только.
Я о Условие ?
C++
1
b= false, cout << "false == b. Cycle's terminated."
: (2й вариант) этом. Пишет что не может привести к типу int - но здесь же нет скобок - это должна быть точка следования
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
20.07.2013, 11:42 17
распишем по другому эту строчку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool foo(int a,bool & b){
   if(a<0){
      b = false;
      return (std::cout << "false == b. Cycle's terminated.");
   }else{
      return (b = true);
   }
}
 
 
int main(){
    bool b;
    int a=6;
    foo(a,b);
}
1
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
20.07.2013, 11:58 18
Вернуло true, даже если а = -7; Здесь понятно(я так думаю)
Но я все равно о другом
C++
1
b = false, cout << "false == b. Cycle's terminated."
здесь вычисляется левый опреатор, а затем вычисляется правый и должно b присвоить true?
Выдает это
Error 2 error C2446: ':' : no conversion from 'int' to 'std::basic_ostream<_Elem,_Traits>' c:\users\Ruslan\documents\visual studio 2005\projects\8.14\8.14\8.14.cpp 41
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
20.07.2013, 12:03 19
Цитата Сообщение от Aliru Посмотреть сообщение
здесь вычисляется левый опреатор, а затем вычисляется правый и должно b присвоить true?
так понятнее:
C++
1
2
b = (false, cout << "false == b. Cycle's terminated.")
(b = false), cout << "false == b. Cycle's terminated."
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.07.2013, 12:08 20
Цитата Сообщение от Aliru Посмотреть сообщение
Да, я это читал - и куда возвращает тогда значение
Это не паскаль, здесь допускается возврат значения вникуда.
0
20.07.2013, 12:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2013, 12:08
Помогаю со студенческими работами здесь

Точка или запятая? Что нужно ставить после запятой?
Как определить что нужно ставить, между числами? На одном компьютере ругается что точка, на другом...

Дана строка S. Известно, что в ней есть по крайней мере одна запятая, найти такое число i, Si – последняя по порядку запятая
Дана строка S. Известно, что в ней есть по крайней мере одна запятая, найти такое число i, Si –...

Оператор запятая
Что означает запятая в языке C#? Я попробовал, но она не работает точно таким же образом как в...

Оператор запятая
Есть такой код (вытащен деобфускацией): if (3 &gt; t &amp;&amp; (t = 1), aux = max, dx &gt; dy &amp;&amp; (dy +=...

запятая - это специальный оператор C++
Доброе время суток.Кому-то вопрос покажется &quot;азы&quot;,но однако хотелось бы понять. #include...

даны натуральное число n, s1..sn. Известно, что среди s1..sn есть по крайней мере одна запятая. Найти такие натуральные i, что:
даны натуральное число n, s1..sn. Известно, что среди s1..sn есть по крайней мере одна запятая....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru