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

Изучаю C++ иногда бывает непонятно - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.95
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
27.11.2012, 15:03     Изучаю C++ иногда бывает непонятно #1
Здравствуйте. Я изучаю С++ по книжкам, по видео и прочим заметкам в интернете. Уже где-то дней 7 учу. С++ первый язык который изучаю. Сейчас читаю
Название книги: Освой самостоятельно C++ за 24 часа, 4-е издание
Автор: Либерти, Джесс, Хорват, Дэвид
Кстати хорошая книга, советую начинающим.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 15:03     Изучаю C++ иногда бывает непонятно
Посмотрите здесь:

Изучаю с++ C++
Бывает ли у вас такое C++
Изучаю С++ C++
изучаю классы C++
C++ В общем изучаю маленько как кодить в ТС, и вот такая шляпа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
28.11.2012, 06:45  [ТС]     Изучаю C++ иногда бывает непонятно #21
Апгрейды того что я ещё понял как работает функция:
Вычисления в теле функции могут быть любые, после чего возможен вариант того что результат вычислений будет присвоен какойто переменной например Х и с этой переменной результат отправляется в функцию через команду return. Например:

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
#include <iostream>
float Convert(float);
int main ()
{
float TempFer;
float TempCel;
std::cout<<"Please enter the temperature in Fahrenheit:";
std::cin>>TempFer;
TempCel=Convert(TempFer);
std::cout<<"\nHere`s temperature in Celsius:";
std::cout<<TempCel<<std::endl;
}
 
float Convert(float Fer)
{
 float Cel;
  Cel=((Fer-32)*5)/9
 
  return Cel;     //Отсюда результат вычислений строки 18 передаётся в функцию Convert 
                 //через переменную Cel.. 
                //Но на какую именно функцию? На ту что на строке 15 или сразу
               // на ту что на строке 10 откуда она
              // была вызвана?
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 06:54     Изучаю C++ иногда бывает непонятно #22
Откуда вызвана, туда и вернется.

Добавлено через 5 минут
Функции в C++
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
28.11.2012, 08:02  [ТС]     Изучаю C++ иногда бывает непонятно #23
В строке 3 указан тип возвращаемого значения для функции Convert это float(перед функцией Convert). Этот тип виден во всём коде потому что это глобальная переменная, поэтому в строке 10 не указан этот тип для Convert. Почему тогда тип возвращаемого значения для функции надо указывать в определении функции? В строке 15.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 08:11     Изучаю C++ иногда бывает непонятно #24
Цитата Сообщение от koderman Посмотреть сообщение
В строке 3 указан тип возвращаемого значения для функции Convert это float(перед функцией Convert). Этот тип виден во всём коде потому что это глобальная переменная, поэтому в строке 10 не указан этот тип для Convert. Почему тогда тип возвращаемого значения для функции надо указывать в определении функции? В строке 15.

Не по теме:

Вы где-то учитесь или самообучение?



C++
1
float Convert(float);
Это не переменная. Это прототип функции (объявление функции). Эта строчка говорит компилятору, что такая функция существует, но её реализация находится где-то в другом месте кода.

В строке же 15 как раз начинается код самой функции.
Что касается строки 10:
C++
1
TempCel=Convert(TempFer);
Здесь переменной TempCel присваивается то значение, которое вернет функция.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
28.11.2012, 08:38  [ТС]     Изучаю C++ иногда бывает непонятно #25
Самообучение. Функции вроде важная тема, хочется хорошо усвоить. ну почти всё уже понял по функциям. Я может догадываюсь как оно должно быть, но варианты как можно сделать неправильно я пишу сюда(уточнение, сомнение)))


ПЕРВОЕ УПОМИНАНИЕ функции Convert (в теле функции main) находится в строке 10, откуда функция и вызывается. Поэтому компилятор должен знать какое значение должна возвращать данная функция. Но в строке 10 перед функцией Convert не стоит тип возвращаемого значения. Тоесть мне так кажется что в строке 10 надо указать этот тип а в строке 15 можно не указывать. (Не знаю. Зависит от того глобальная ли переменная в строке 10 или локальная).
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 08:43     Изучаю C++ иногда бывает непонятно #26
Цитата Сообщение от koderman Посмотреть сообщение
Зависит от того глобальная ли переменная в строке 10 или локальная
Вообще никак не связанно.
Цитата Сообщение от koderman Посмотреть сообщение
Но в строке 10 перед функцией Convert не стоит тип возвращаемого значения.
Тип возвращаемого значения при вызове функции указывать не нужно.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
28.11.2012, 08:48  [ТС]     Изучаю C++ иногда бывает непонятно #27
Аха, ок. Ну я по программам с функциями прошёлся, там нигде не указан тип в вызове функции. Видно функция принимает тип который ей дадут return´ом или всёже из прототипа берёт тип.)) (ведь функция без типа это автоматически int)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 08:59     Изучаю C++ иногда бывает непонятно #28
Вот у Вас функция:
C++
1
2
3
4
5
6
float Convert(float Fer)
{
 float Cel;
  Cel=((Fer-32)*5)/9;//; здесь забыли ))) 
  return Cel;
}
Здесь указан и тип функции и тип параметров и имена параметров.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
28.11.2012, 08:59     Изучаю C++ иногда бывает непонятно #29
Цитата Сообщение от koderman Посмотреть сообщение
Видно функция принимает тип который ей дадут return´ом или всёже из прототипа берёт тип.))
из прототипа
C++
1
2
3
4
int fnc1()
{
 return 1;
}
вернет int как указано
int fnc1()
а вот здесь int превратится double(приведение типов, в данном случае неявное)
C++
1
double n=fnc1();
функция возвращает int потом это значение конвертируется в double и присваивается переменной n
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
28.11.2012, 13:45     Изучаю C++ иногда бывает непонятно #30
(ведь функция без типа это автоматически int)
В C++ такого нет.

Ты видимо совсем не понимаешь, зачем нужен прототип и что он из себя представляет. Прототип уже содержит сигнатуру функции (возвращаемый тип и типы принимаемых аргументов), так зачем указывать ее тип при вызове?
WoLTRoN
Сообщений: n/a
28.11.2012, 22:44     Изучаю C++ иногда бывает непонятно #31
Думаю, с Джессом Либерти еще много будет непонятного - чтобы продемонстрировать идеи, он вводит примеры по 200 строк нудного кода, никому не нужного и нигде не применяющегося. Вообще я читаю его книгу, где освоение идет за 21 день, но этот код я там видел.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 07:59     Изучаю C++ иногда бывает непонятно #32
Цитата Сообщение от koderman Посмотреть сообщение
Я имею ввиду здесь на форуме буквами вводить текст, напечатать.
А как ты бумагу на форум запихаешь?

Добавлено через 4 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
тебе похоже довольно сложно понять вообще, что такое функции. В такие моменты хочется посоветовать изучить ассемблер "для понимания, как это работает"
но сам понимаешь, что изучать асм будет может даже ещё сложнее.
Нет. Раз уж он мыслит в терминах сигналов и физических процессов, то чем ниже уровень, тем ему будет проще. Это полный уникум и начинать ему надо с ЭНИАКа, потом переходить к программированию в опкодах, потом к ассемблеру, потом к решётке с паскалем, потом к чистым сям и только после этого браться за плюсы.

Добавлено через 4 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
В 64 битных системах немного по другому - первые четыре аргумента передаются на регистрах RCX, RDX, R8 и R9. Остальные аргументы передаются через стек.
А при чём здесь разрядность системы? В любой системе с любой разрядностью возможна оптимизация в виде передачи части параметров через регистры.

Добавлено через 3 минуты
Цитата Сообщение от koderman Посмотреть сообщение
Вот например важной я считаю информацию о том сколько места в памяти занимают переменные int, long, double
Рано. Сначала надо понять смысл операций. В том числе, вызова/возврата. И только потом браться за ручную оптимизацию по расходу памяти. Иначе всё равно не сможешь применить разрядности типов.

Добавлено через 7 минут
Цитата Сообщение от koderman Посмотреть сообщение
Может надо вместо этих цифр х и y поставить?
Нет.
Цитата Сообщение от koderman Посмотреть сообщение
Куда вернуть?
Функция же где то вызвана, например,
C++
1
a=func1(x, y);
, вот в этот оператор присваивание и вернёт. В тех языках, где функции отличают от процедур, функция есть подпрограмма, возвращающая значение через собственное имя, на сях и плюсах так ведут себя все подпрограммы с единственной оговоркой: если тип функции void, то через собственное имя она возвращает специальное значение без данных, которое девать некуда, причём, такой возврат значения происходит лишь в представлении человека, который прогу написал, или читает, на низком же уровне происходит выход из процедуры без возврата значения.

Добавлено через 2 минуты
Цитата Сообщение от koderman Посмотреть сообщение
Вычисления в теле функции могут быть любые, после чего возможен вариант того что результат вычислений будет присвоен какойто переменной например Х и с этой переменной результат отправляется в функцию через команду return.
Из функции. Из, а не в.

Добавлено через 2 минуты
Цитата Сообщение от koderman Посмотреть сообщение
/Отсюда результат вычислений строки 18 передаётся в функцию Convert
* * * * * * * * *//через переменную Cel..
* * * * * * * * //Но на какую именно функцию? На ту что на строке 15 или сразу
* * * * * * * *// на ту что на строке 10 откуда она
* * * * * * * // была вызвана?
Значение Cel подставляется вместо имени функции Convert в строке 10, где она была вызвана. Строка 15 - это только адрес точки входа, ни какие значения туда вернуть нельзя, да и не поможет.

Добавлено через 10 минут
Цитата Сообщение от koderman Посмотреть сообщение
В строке 3 указан тип возвращаемого значения для функции Convert это float(перед функцией Convert). Этот тип виден во всём коде потому что это глобальная переменная, поэтому в строке 10 не указан этот тип для Convert. Почему тогда тип возвращаемого значения для функции надо указывать в определении функции? В строке 15.
Это не переменная. Это именно тип. Кроме того, эйси.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
float Convert(float);
int main ()
{
float TempFer;
float TempCel;
std::cout<<"Please enter the temperature in Fahrenheit:";
std::cin>>TempFer;
Convert(TempFer);
std::cout<<"\nHere`s temperature in Celsius:";
std::cout<<TempCel<<std::endl;
}
 
Convert(float Fer)
{
 float Cel;
  Cel=((Fer-32)*5)/9
 
  return Cel;
}
сравни строки 10 и 15 и поймёшь, что теперь строка 15 - это вызов функции, причём, синтаксически ошибочный, так как не завершён точкой с запятой. Можно сказать: "функция возвращает float и его надо куда то девать, а он не передан в операнд какого либо оператора, или в параметр другой функции, то есть не исспользован.". Но на сях и плюсах нет процедур. А это значит, что void-функции не отличаются ни чем, кроме типа.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
void f(int *a, int n, int *max);
int main ()
{
 int a[10]={2, 1, 3, 54, 4, 8, 3, 2, 4, 6};
 int m;
 f(a, 10, m);
 std::cout<<m<<std::endl;
 return 0;
}
f (int *a, int n, int *max)
{
 int *m;
 int *p;
 for (p=a+n-1, m=a; p>a; --a)
 {
   if (*p<*m)
   {
    m=p;
   }
 }
 *max=*m;
}
Добавлено через 3 минуты
Чем теперь 11-я строка отличается от 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
#include <iostream>
void f(int *a, int n, int *max);
int main ()
{
 int a[10]={2, 1, 3, 54, 4, 8, 3, 2, 4, 6};
 int m;
 f(a, 10, m);
 std::cout<<m<<std::endl;
 return 0;
}
void f (int *a, int n, int *max)
{
 int *m;
 int *p;
 for (p=a+n-1, m=a; p>a; --a)
 {
   if (*p<*m)
   {
    m=p;
   }
 }
 *max=*m;
}
. Теперь в 11-й строке тип говорит о том, что это не операция, а декларация, а значит не вызов, так как всякий вызов есть операция. Декларация чего? Скобки с параметрами говорят, что функции, а не переменной.

Добавлено через 3 минуты
Цитата Сообщение от koderman Посмотреть сообщение
Зависит от того глобальная ли переменная в строке 10 или локальная)
Нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
float Convert(float);
int main ()
{
float TempFer;
int TempCel;
std::cout<<"Please enter the temperature in Fahrenheit:";
std::cin>>TempFer;
TempCel=Convert(TempFer);
std::cout<<"\nHere`s temperature in Celsius:";
std::cout<<TempCel<<std::endl;
}
 
float Convert(float Fer)
{
 float Cel;
  Cel=((Fer-32)*5)/9
 
  return Cel;
}
. Это валидный текст, значение float при присваивании будет округлено вниз и присвоено переменной int, но тип функции всё равно float.

Добавлено через 1 минуту
Цитата Сообщение от koderman Посмотреть сообщение
Видно функция принимает тип который ей дадут return´ом или всёже из прототипа берёт тип.))
Ни то, ни то. Прототип вообще не обязателен, если функция не используется до своего описания. А тип она берёт из собственного заголовка, у тебя это строка 15.

Добавлено через 1 минуту
Цитата Сообщение от koderman Посмотреть сообщение
ведь функция без типа это автоматически int
Функция не может не иметь типа, если ты не написал тип, то это вызов, а не объявление, таким образом функции без типа и исключаются. И ни каких автоматических типов.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
из прототипа
не путай прототип с заголовком. Только из заголовка, прототип же сравнивается на совпадение и при различии типов будет зафиксирована синтаксическая ошибка.

Добавлено через 1 минуту
При вызове можно указать тип.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
float Convert(float);
int main ()
{
float TempFer;
float TempCel;
std::cout<<"Please enter the temperature in Fahrenheit:";
std::cin>>TempFer;
TempCel=(int)Convert(TempFer);
std::cout<<"\nHere`s temperature in Celsius:";
std::cout<<TempCel<<std::endl;
}
 
float Convert(float Fer)
{
 float Cel;
  Cel=((Fer-32)*5)/9
 
  return Cel;
}
Добавлено через 1 минуту
В строке 9 будет двойное приведение типа: приведение float к int, при котором значение округляется вниз до целого и неявное int к foat, чтоб присвоить результат первого приведения переменной типа float.

Добавлено через 27 секунд
На саму функцию это не влияет.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
29.11.2012, 11:52  [ТС]     Изучаю C++ иногда бывает непонятно #33
Цитата Сообщение от Герц Посмотреть сообщение
В C++ такого нет.

Ты видимо совсем не понимаешь, зачем нужен прототип и что он из себя представляет. Прототип уже содержит сигнатуру функции (возвращаемый тип и типы принимаемых аргументов), так зачем указывать ее тип при вызове?
Герц, ну во-первых первое моё предположение было именно такое
Изучаю C++ иногда бывает непонятно
На что мне ответили что это не так, исходя из чего я стал строить другую теорию.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
29.11.2012, 11:58  [ТС]     Изучаю C++ иногда бывает непонятно #34
Цитата Сообщение от taras atavin Посмотреть сообщение
Добавлено через 1 минуту
Функция не может не иметь типа, если ты не написал тип, то это вызов, а не объявление, таким образом функции без типа и исключаются. И ни каких автоматических типов.
Это цитата из книги
Миниатюры
Изучаю  C++ иногда бывает непонятно  
Croessmah
29.11.2012, 12:06
  #35

Не по теме:

Что за книга?

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 12:07     Изучаю C++ иногда бывает непонятно #36
Попробуй не указать тип. Сам факт того, написанное означает заголовок функции определяется по наличию типа и скобок.
Croessmah
29.11.2012, 12:08
  #37

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Попробуй не указать тип. Сам факт того, написанное означает заголовок функции определяется по наличию типа и скобок.
А Вас не смущает первое предложение в приведенном куске книги?

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 12:14     Изучаю C++ иногда бывает непонятно #38
И про совпадение с прототипом тоже бред. На полюсах есть такое понятие, как перегрузка. А перегрузка - это как раз различие в типах параметров между версиями функции. Валидно:
C++
1
2
3
4
5
6
7
8
9
int abs(int x); // Прототип одной версии функции, если она не использована, то её на самом деле может и не быть
double abs(double x)// заголовок другой версии той же функции, так как это другая версия, то она обязана отличаться типом параметра
{
 if (x<0.0)
 {
   retunrn -x;
 }
 retunrn x;
}
. Заметь: обязана отличаться. Сравнение прототипа с заголовком выполняется совсем не так. Если в прототипе и заголовке одно функции совпадает количество, типы и порядок параметров, или параметры в обоих случаях отсутствуют, то тип её возвращаемого значения должен совпадать в прототипе и в заголовке. Только так и ни как иначе. Можешь проверить на любом компиляторе.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
29.11.2012, 12:21  [ТС]     Изучаю C++ иногда бывает непонятно #39
Куда вернуть?
Цитата Сообщение от taras atavin Посмотреть сообщение
Функция же где то вызвана
C++
1
a=func1(x, y);
taras atavin, Вы очень непонятно объясняете.
Вот Jupiter мне сказал
Цитата Сообщение от Jupiter Посмотреть сообщение
в место вызова функции
Это более понятно ведь? Или как считаете? Но не полный ответ всёравно. В книге ещё круче. Там написано что результат возвращается в окружение этой функции. Читаем что такое окружение. Окружение это область между фигурных скобок. Ну иди свищи, пойди пойми в какую дыру уходит результат через return.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:

Что за книга?

http://www.kodges.ru/19625-osvojj-sa...-24-chasa.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 12:26     Изучаю C++ иногда бывает непонятно
Еще ссылки по теме:

Изучаю классы, что-то не выходит C++
Openssl. Иногда вызов функций шифрования проходит нормально, иногда нет C++
Почему иногда отслеживается нажатие на три клавиши сразу, а иногда нет C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 12:26     Изучаю C++ иногда бывает непонятно #40
Прототип обязателен, если функция используется раньше, чем реализована:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int f();// прототип
int main()
{
 int a;
 a=f();
 std::cout<<a<<std::endl;
 return 0;
}
int f()// заголовок
{
 return 2;
}
. Проверь на любом компиляторе. Попробуй убрать прототип и программа не откомпилится. А параметров то нет. Если же функция не используется раньше, чем реализована, то прототип не обязателен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
int f(double x)// сразу заголовок
{
 if (x<0.0)
 {
  return (int)(x*x);
 }
 return (int)(x*10);
}
int main()
{
 int a;
 dounle b;
 b=-4.0;
 a=f(b);
 std::cout<<a<<std::endl;
 return 0;
}
. Проверь на любом компиляторе. Прототипа нет, а прога компилится и работает. А параметры то есть.

Добавлено через 1 минуту
Цитата Сообщение от koderman Посмотреть сообщение
Это более понятно ведь? Или как считаете?
ТЫ же как раз этого и не понял.

Добавлено через 1 минуту
Ну от "фундоментальных" основ на жалких пять с половиной мегабайт уже диагнозом несёт, не сказать ещё хужей.

Добавлено через 1 минуту
С такой аннотацией должна быть целая библиотека, а то, что можно впихнуть в брошюру, называется азами.
Yandex
Объявления
29.11.2012, 12:26     Изучаю C++ иногда бывает непонятно
Закрытая тема Создать тему
Опции темы

Текущее время: 12:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru