LINUX.ORG.RU

в приоритетности

ananas ★★★★★
()

Не, в порядке выполнения - постфиксная и префиксная форма...

anonymous
()

Обе увеличивают с на 1 но результат с++ равен с, а ++с равен (с+1).

kswapd
()

>Обе увеличивают с на 1 но результат с++ равен с, а ++с равен (с+1).

Неправильно... :(

Разница в порядке выполнения.
Т.е. в том: до или после прибавления производится обработка значения переменной.

Пример:

int i;

for (i=0; i<3;i++)
fprintf(stdout,"%u\n",i);

Имеет следующий вывод:
0
1
2

А такой пример:

int i;

for (i=0; i<3;++i)
fprintf(stdout,"%u\n",i);

Имеет следующий вывод:
1
2

Ikonta_521
()

Тоесть я так понимаю: c++ - сначала возвращает текущее значение, а потом присваевает увеличиное значение с на 1. ++с - увеличивает значение на 1, присваевает его с и возвращает увеличеное значение.

Так ?

n=c++; // n=c c=c+1 n=++c; // n=c+1 c=c+1

NetKnight
() автор топика

2Ikonta_521

Primer - polnaja erunda.
Oba zikla delajut tozhe samoje, tol'ko vtoroj (teoreticheski)
neskol'ko bystree

anonymous
()

скорее

n=c++; => n=c; c=c+1;

n=++c; => c=c+1; n=c;

ananas ★★★★★
()

Пример действительно фиговый :) Нет никакой разницы, как увеличивать счетчик в for-e. Разница, как уже было сказано, в том, что ++с сначала увеличивается, а потом возвращает значение. с++ наоборот. Как легко понять, реализация (обычно) с++ несколько накладнее, ведь нуюно сначала сохранить старое значение, потом увеличить переменную, а потом как-то использовать сохраненное значение.

anonymous
()
Ответ на: комментарий от Ikonta_521

Ikonta_521 (*) (2003-03-20 09:07:00.838342):
>> Обе увеличивают с на 1 но результат с++ равен с, а ++с равен (с+1).
>
> Неправильно... :(

Как раз правильно! ( в отличие от приведенного тобой примера, BTW - впрочем,
про пример уже проехали).

В Це (в отличие от Паскаля, например) любая операция возвращает значение.
c++ - операция, и ++с - операция. Операция c++ возвращает прежнее значение,
содержащееся в c (т.е., "результат с++ равен с") и имеет "побочный эффект" -
инкремент c на 1. Операция ++c возвращает новое значение c и имеет тот же
самый "побочный эффект" - инкремент c на 1.

> ...до или после прибавления производится обработка значения переменной.
Несколько корявый способ выразить то же самое, с чем ты не соглашаешься.
А какая "обрабатка" производится в приведенном тобой примере?
А, например, в операторе с++; ?

Die-Hard ★★★★★
()

2NetKnight:
Ну, вроде, ты все понял. На всякий случай, вот тебе "улучшенный"
пример ananas (*) (2003-03-20 13:20:40.843344):

#include <stdio.h>

int main(void)
{
int c,b;
  b=c=1;
  printf("c=%d, c++=%d\n",b,c++);

  c=b;
  printf("c=%d, ++c=%d\n",b,++c);

return 0;
}

Обрати внимание: в отличие от Фортрана, например, в Це любая операция 
возвращает значение. Ну, не совсем точно выразился: операция всегда и 
везде возвращает значение,  на то она и операция, но в Фортране, 
например, 
a=b
- ОПЕРАТОР присваивания, а в Це - ОПЕРАЦИЯ. Оператор получится, когда 
ты добавишь точку с запятой в конец.

Например , ты можешь написАть такой оператор:
a=(b=(c+=d++))+1;

Обрати внимание на семантическое отличие точки с запятой в Це от
Паскаля: в последнем точка с запятой используется для РАЗДЕЛЕНИЯ 
операторов, а в Це точка с запятой используется для ПОСТРОЕНИЯ
оператора: оператор получается добавлением точки с запятой к операции.

Например:
a=1
  -операция, возвращает 1, "побочный эффект" - присваивает a значение 1.
b=(a=1)+1
 -операция, возвращает 2, "побочный эффект" - присваивает a значение 1
  и b - значение 2.
b=(a=1)+1; 
 -оператор, ничего не возвращает, но присваивает a значение 1,
  а b - значение 2.

Die-Hard ★★★★★
()

с++ это язык программирования а ++с это никримент

anonymous
()
Ответ на: комментарий от Die-Hard

>Ну, вроде, ты все понял. На всякий случай, вот тебе "улучшенный"

Оно и имелось в виду. А с тем фрагментом, что я приводил - да, ошибся, с кем не бывает.

Ikonta_521
()
Ответ на: комментарий от anonymous


> Как легко понять, реализация (обычно) с++ несколько накладнее, ведь
> нуюно сначала сохранить старое значение, потом увеличить
> переменную, а потом как-то использовать сохраненное значение.

Бред. Зачем сохранять старое значение? Оно сразу используется, а потом уже увеличивается. Может так нагляднее:

// a = ++c
incl c
movl c, %eax
movl %eax, a

// a = c++
movl c, %eax
movl %eax, a
incl c

kswapd
()

int cpp(int *c)
{
   int ret = *c;
   (*c)++;
   return ret;
}

int ppc(int *c)
{
   (*c)++;
   return *c;
}

anonymous
()

int cpp(int *c)
{
   int ret = *c;
   *c = (*c) + 1;
   return ret;
}

int ppc(int *c)
{
   *c = (*c) + 1;
   return *c;
}

Так более понятно

anonymous
()

> int cpp(int *c)
> {
> int ret = *c;
> *c = (*c) + 1;
> return ret;
> }

> int ppc(int *c)
> {
> *c = (*c) + 1;
> return *c;
> }

И что? Значение, возвращаемое c++/++c используется только один раз и сохранять его не имеет смысла. И никаких функций cpp/ppc не вызывается :). Ну если и так не понятно:

// a=c++
a = c;
c = c+1;

// a=++c
c = c+1;
a = c;

kswapd
()

Эй люди чего вы так разгорячились это такой прикол на собиседованиях
спрашивают...
Одни начинают как вы типа код гнать примеры приводит а другие просто
отвечают: с++ это язык программирования а ++с это никримент с
Проверка на чувство юмора типа но человек или програмер совсем
отмороженный...

anonymous
()

>Проверка на чувство юмора типа но человек или програмер совсем
отмороженный...

Програмер должен быть отмороженным, иначе это плохой прогамер :)))

kswapd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.