Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

Как это читается по-русски

22.10.2013, 01:55. Показов 4023. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
int MyFunc(...)
{
  cout<<MyFunc[2]; //это
  //cout<<MyFunc    //это
  return 0;
}
 
 
int main() {
  MyFunc(100);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2013, 01:55
Ответы с готовыми решениями:

Как это читается
(*r).sled r - &gt; sled Между ними нет разницы

Re: Как это читается по-русски
Нужны администраторы групп ВКонтакте. Зарплата 300 рублей в час. График посменный 4 часа в сутки....

На сколько это по-русски?
Проверьте, пожалуйста: .

Fretting precession - как по-русски?
Если я не ошибаюсь, что в русской терминологии термин &quot;прецессия&quot; употреблется только в применении...

35
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 15:52 21
Author24 — интернет-сервис помощи студентам
MyFunc и MyFunc[2] для вывода - одно и то же, так как имеют одинаковый тип - указатель на функцию определенного типа, который неявно приведется к bool. Просто MyFunc[2] содержит адрес, смещенный на 2 размера указателя от MyFunc. Поэтому мы можем вызвать MyFunc() и все будет норм, но при вызове MyFunc[2]() мы получим Runtime Error.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.10.2013, 16:14 22
попробовал написать в VS2008
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
34
35
36
// pritfFunc.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
int MyFunc(...)
{
 // printf("%p",(bool*)MyFunc[2]); // ошибка  error C2109: для индекса требуется массив или указатель
 // std::cout<<MyFunc[2]; // то же самое
    
    printf("\nprintf MyFunc\n"); 
    std::cout<<MyFunc<<std::endl;
    printf("%p\n",MyFunc );   //это
  return 0;
}
 
int MyFunc1(int a)
{
   printf("\nprintf MyFunc1\n"); 
   std::cout<<MyFunc1<<std::endl;
    printf("%p\n",MyFunc1 );   //это
  return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{  
   printf("\nprintf Main Begin \n"); 
   printf("%p\n",MyFunc );
   printf("%p\n",MyFunc1 );  
    MyFunc(100);
    MyFunc(100);
    printf("\nprintf Main End\n"); 
   printf("%p\n",MyFunc );
   printf("%p\n",MyFunc1 );  
    return 0;
}
и получил вот что
printf Main Begin
013410FA
013411CC

printf MyFunc
013410FA
013410FA

printf MyFunc1
013410FA
013410FA

printf Main End
013410FA
013411CC
причем при каждом запуске цифры разные
трудно назвать адресами функций(тем более что печать внутри разных функций дает один адрес)
Может это стек
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
23.10.2013, 16:19 23
Цитата Сообщение от ValeryS Посмотреть сообщение
тем более что печать внутри разных функций дает один адрес
может дело в самой печати?
тогда как же передают функции в качестве параметров, одинаковыми эти "указатели" быть не могут уж точно
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
23.10.2013, 19:02  [ТС] 24
Если кто-то врубился и думает, что я и сам всё понял, то нет. Я пока еще нет. Я пока еще вообще ничего не понял. Да и с англ. я плохо дружу.

Еще мне интересен такой момент
C++
1
2
3
4
5
6
7
int MyFunc(...)
{
   int MyFunc = 333;
   double MyFunc =777;
 
  return 0;
}
т.е. MyFunc я могу использовать и не объявляя как переменную, но при этом объявить переменную с таким именем и объявить еще одну с таким же уже не получается. Хотя объявить одну допускается.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 19:20 25
Цитата Сообщение от daslex Посмотреть сообщение
т.е. MyFunc я могу использовать и не объявляя как переменную, но при этом объявить переменную с таким именем и объявить еще одну с таким же уже не получается. Хотя объявить одну допускается.
MyFunc - это никак не переменная, это имя функции, которое в выражениях неявно может приводиться к адресу функции. Имена могут скрываться во вложенной области - int MyFunc скрывает имя функции, отныне имя MyFunc ссылается на переменную типа int. Но в одной и той же области не может быть определено несколько переменных с одним именем. Поэтому потом double MyFunc писать нельзя.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
23.10.2013, 20:10  [ТС] 26
Осталось разобраться зачем преобразование к bool нужно.
я попробовал, не подошло для понимания.
C++
1
2
3
4
5
6
void MyFunc(){}
 
int main()
{
    std::cout<<MyFunc<<" = "<<int(MyFunc)<<"\n";
}
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 21:12 27
Цитата Сообщение от daslex Посмотреть сообщение
Осталось разобраться зачем преобразование к bool нужно.
Ну это тоже в принципе понятно. Нам нужно неявное преобразование в bool для проверки в if.
C++
1
2
3
4
5
6
7
8
9
10
11
typedef void (*Foo)(int);
 
void check(Foo f)
{
    // нужно проверить:
    // вдруг нам передали нулевой указатель
    if (f) // тут неявное преобразование из указателя на функцию в bool
      f(3);
    else
      cout << "null";
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
23.10.2013, 22:04  [ТС] 28
тут параметр-то причем?
указатель в качестве параметра будет иметь другой адрес.
и если имя функции- это имя функции и не переменная
указатель - это не имя функции и является переменной.

меня интересует преобразование имени функции, а не проверка указателя как переменной.

Добавлено через 1 минуту
в вашем пример ключевой check
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 23:12 29
Цитата Сообщение от daslex Посмотреть сообщение
меня интересует преобразование имени функции, а не проверка указателя как переменной.
Так я про это и написал.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
typedef void (*Foo)(int);
void foo(int) {}
 
void check(Foo f)
{
    // нужно проверить:
    // вдруг нам передали нулевой указатель
    if (f) // тут неявное преобразование из указателя на функцию в bool
      f(3);
    else
      cout << "null";
}
 
int main() {
    check(foo);
    return 0;
}
Так понятней? Нам нужно уметь преобразовывать имя функции (что в выражении является указателем) в bool.
f и foo указывают на одно и то же.

Upd
На всякий случай: преобразование в bool относится не только к имени функции, оно относится ко всему, что имеет тип указателя на функцию. Преобразование имени функции в bool - лишь частный случай более общего преобразования из указателя на функцию в bool.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
23.10.2013, 23:42  [ТС] 30
нет. непонятно. мне и первый код понятен. но не вижу тесной связи своего вопроса о функции с параметрами функции, даже несмотря на то, что они указывают на одно и то же.
это на притягивание за уши похоже между прочим.

вы проверяете параметр на истинность. Этот параметр может быть и 0 и 1.
отличие имени функции от указателя (который приходит как параметр) в том, что оно всегда, всегда только 1.
насколько я понял.

Добавлено через 14 минут
это если сделали, значит с какой-то целью.
вот и хотелось бы разобраться с какой целью вообще имя функции преобразовывать в bool, да и в 1 всегда.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 23:45 31
Функция не единица. Распишу по шагам, что происходит в if.
1) имя функции преобразуется в указатель
2) указатель преобразуется в bool
Например для переменных-указателей мы начинаем сразу с пункта 2.
Для имен функций вначале выполняется шаг 1. Так как полученный указатель никогда не будет нулевым, то преобразование его в bool всегда будет давать true, поэтому оператор вывода показывает 1.

И еще раз повторю - имя функции не преобразуется в bool. Оно преобразуется в указатель (который никогда не NULL). А уже указатель - в bool (это определено для любых указателей). А так как указатель будет никогда не NULL, то bool будет всегда true. А оператор вывода выводит true как единицу.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 23:54 32
Цитата Сообщение от daslex Посмотреть сообщение
отличие имени функции от указателя (который приходит как параметр) в том, что оно всегда, всегда только 1.
насколько я понял.
Фукция всегда имеет не нулевой адрес, поэтому и true (1).
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
23.10.2013, 23:57  [ТС] 33
я успел исправить функцию на имя функции.

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
И еще раз повторю
в первые от вас это слышу :D



Так-то теперь я всё понял.
0
ct0r
24.10.2013, 00:02
  #34

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
в первые от вас это слышу
Ну может я и не умею объяснять, зато я терпеливый :)

0
daslex
24.10.2013, 00:07  [ТС]
  #35

Не по теме:

ct0r, вы сразу и написали об этом. (то, что в еще раз повторю). я пошутил, что впервые слышу.
Просто вам не достаточно полно удалось сказать с первой попытки. Вот и вышло, что я не понимал о чем речь.

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 01:01 36
Цитата Сообщение от daslex Посмотреть сообщение
я успел исправить функцию на имя функции.
Имя функции - это её адрес.
1
24.10.2013, 01:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 01:01
Помогаю со студенческими работами здесь

Adsense - как сделать по-русски?
У меня проблема: Гугл Адсенс вставляет свою рекламу на мой сайт на английском языке. Хотя при...

Как прописать строки по- русски
Как прописать строки по-русски, чтобы при выводе на экран не было иероглифов?

Можно ли как определить как писать формулы в яцейки из VBA по русски или английски?
в общем проблема в том можно ли как определить как писать формулы в яцейки из VBA по русски или...

Как по-русски обозвать назначение члена?
typedef struct _CONSOLE_SELECTION_INFO { DWORD dwFlags; COORD dwSelectionAnchor; ...


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

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