powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / i++ и ++i при передаче в функцию
13 сообщений из 13, страница 1 из 1
i++ и ++i при передаче в функцию
    #38105198
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случай 1.
Код: sql
1.
2.
int i = 0 ;
foo(++i);


Случай 2.
Код: sql
1.
2.
int i = 0 ;
foo(i++);


Вопрос, какое значение i будет при выполнении кода функции. Конкретно интересует механизма работы.
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105268
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17,

Блин, я делфинист с хз-сколькилетним стажем и то знаю. В любой книжке для начинающих есть. Лень книжку открыть, в гугл заведи
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105272
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: даже лень скомпилить за 30 сек прогу
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105350
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17,

Ответ: при вызове функции вычисляется значение выражения и присваивается формальному параметру функции.
Встречные вопросы: чему в Ваших примерах равны значения выражений i++ и ++i? Как значение переменной i, объявленной, судя по примеру, как локальная переменная некоторой функции, может повлиять на ход работы функции foo, вызываемой в Вашем примере?
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17Случай 2.
Код: sql
1.
2.
int i = 0 ;
foo(i++);


Конкретно интересует механизма работы.
Механизм работы этого случая такой:
Код: sql
1.
2.
3.
4.
int i = 0 ;
int tmp = i;
i = i + 1; 
foo(tmp); 
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105559
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 - значение i после увеличения,
2 - значение i до увеличения.
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105570
Или так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyda17Случай 2.
Код: sql
1.
2.
int i = 0 ;
foo(i++);


Конкретно интересует механизма работы.
Механизм работы этого случая такой:
Код: sql
1.
2.
3.
4.
int i = 0 ;
int tmp = i;
i = i + 1; 
foo(tmp); 


Или так?
Код: sql
1.
2.
int i = 0 ;
foo(i); i++;
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105610
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так?,

Ваш код показывает что делается, а не как :)
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105628
Или так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyИли так?,

Ваш код показывает что делается, а не как :)
Может быть ваш код более понятен :)
Но ни мой, ни ваш код не будет эквивалентным исходному, если функция например void foo(int &a) { a += 5; }

А если совсем точно, то на 100% эквивалентный код:
Код: plaintext
1.
2.
int i = 0 ;
foo(int(i)); i++;
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105724
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или такНо ни мой, ни ваш код не будет эквивалентным исходному, если функция например void foo(int &a) { a += 5; }

А если совсем точно, то на 100% эквивалентный код:
Код: plaintext
1.
2.
int i = 0 ;
foo(int(i)); i++;


Опять не то .
Это вы рассказываете как компилятор рассматривает код (и далеко не на 100% точно, вернее 100% неточно - hint: sequence points).
Я же писал как этот код выполняется внутри (предполагаем что программу удалось откомпилировать, ведь иначе у нее нет никакого внутреннего устройства ).
А выполняется он именно так и в таком порядке как я написал:
- копия во временную переменную (по научному - вычисление аргумента функции)
- инкремент i (до вызова функции - крайний срок когда по стандарту нужно применить постинкремент в ее аргументах)
- вызов функции
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105731
Или так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyИли такНо ни мой, ни ваш код не будет эквивалентным исходному, если функция например void foo(int &a) { a += 5; }

А если совсем точно, то на 100% эквивалентный код:
Код: plaintext
1.
2.
int i = 0 ;
foo(int(i)); i++;


Опять не то .
Это вы рассказываете как компилятор рассматривает код (и далеко не на 100% точно, вернее 100% неточно - hint: sequence points).
Я же писал как этот код выполняется внутри (предполагаем что программу удалось откомпилировать, ведь иначе у нее нет никакого внутреннего устройства ).
А выполняется он именно так и в таком порядке как я написал:
- копия во временную переменную (по научному - вычисление аргумента функции)
- инкремент i (до вызова функции - крайний срок когда по стандарту нужно применить постинкремент в ее аргументах)
- вызов функции
Да кстати, внутри функции уже инкремент состоялся:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <iostream>
using namespace std;

int i;

void foo(int a) {
    cout << i << endl;
}

int main() {
    i = 0;
    foo(i++);
    cout << i << endl;
    
    return 0;
}


вывод1
1
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38105870
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или так,

А зачем глобальная переменная int i?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include "stdafx.h"

void foo(int a) 
{
  printf("%d\n", a);
}

int _tmain(int argc, _TCHAR* argv[])
{
  int i = 0;
  foo(i++);
  printf("%d\n", i);

  int j = 0;
  foo(++j);
  printf("%d\n", j);
    
  return 0;
}



вывод0
1
1
1
...
Рейтинг: 0 / 0
i++ и ++i при передаче в функцию
    #38106830
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или такAnatoly Moskovskyпропущено...

Опять не то .
Это вы рассказываете как компилятор рассматривает код (и далеко не на 100% точно, вернее 100% неточно - hint: sequence points).
Я же писал как этот код выполняется внутри (предполагаем что программу удалось откомпилировать, ведь иначе у нее нет никакого внутреннего устройства ).
А выполняется он именно так и в таком порядке как я написал:
- копия во временную переменную (по научному - вычисление аргумента функции)
- инкремент i (до вызова функции - крайний срок когда по стандарту нужно применить постинкремент в ее аргументах)
- вызов функции
Да кстати, внутри функции уже инкремент состоялся:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <iostream>
using namespace std;

int i;

void foo(int a) {
    cout << i << endl;
}

int main() {
    i = 0;
    foo(i++);
    cout << i << endl;
    
    return 0;
}


вывод1
1
Что вполне предсказуемо. Вызов функции то уже состоялся.
Да, кстати, а зачем <а> в функцию передается?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / i++ и ++i при передаче в функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]