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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
#1

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

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

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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 01:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как это читается по-русски (C++):

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

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

Как по-русски обозвать целиком эту конструкцию? - C++
Ту что в круглых скобках в операторе for? for (i=0; i&lt;n; ++i) { cout&lt;&lt;i; } В фигурных скобках - тело, вся первая строка - заголовок....

как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке c=a+b,c; - C++
как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке...

как правильно читается ( что значит ) - C++
как правильно читается ? if(t1!=0 &amp;&amp; t3&gt;=0)

Связанный список. Как это делается и зачем это нужно? - C++
Добрый день. Уже который день не могу понять эту тему. Гуглил, но понятнее от этого не стало. Кто-нибудь знает где найти понятный мануал?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
23.10.2013, 13:28 #16
Нет такой перегрузки для ostream который бы принимал указатель функции, но есть неявное преобразование для bool, следовательно указатели функции неявно преобразуются в bool. Это не сделано с какой то целью, а просто допущение.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 13:31 #17
Цитата Сообщение от daslex Посмотреть сообщение
и с какой целью можно применять
Вот этого-то и не нужно делать... Не нужно заниматься извращениями. Эксперименты ради экспериментов?

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
Нет такой перегрузки для ostream который бы принимал указатель функции
Точно знаете? ostream не может адрес вывести?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
23.10.2013, 13:40  [ТС] #18
alsav22, нет.
Не нужно так не нужно.

Но уметь объяснить по мне очень нужно.
Объяснить-то объяснил, например, а на практике посмотреть и бац - тупик. И понятия не имеешь заблуждался в суждениях или был прав.
Это как с Raali тут сначала написал в ответ, что указатель... но информация неполная (а я не могу проверить и понятия не имею, а вдруг собеседник сам заблуждается если не вижу на практике).

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

Даже если я пишу MyFunc[0]=true; , то та же ошибка. Поэтому я стремлюсь убедится каким-то примером.
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
23.10.2013, 13:45 #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Точно знаете? ostream не может адрес вывести?
нет, поверил на слово stackoverflow
Issue
может быть старые стандарты не поддерживали?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 15:17 #20
Цитата Сообщение от daslex Посмотреть сообщение
Но уметь объяснить по мне очень нужно.
Если бы я точно знал, то давно объяснил бы. Для меня тут вопрос довольно туманный. Тем более от компилятора зависит. Почему, в отличие от студии, mingw имя функции воспринимает как булево значение, для меня тоже загадка. Может эксперты что-нибудь скажут....

Добавлено через 9 минут
daslex, ну вот, Raali ссылку выложил, читайте. Если я правильно понял, то это всё касается именно вывода адреса функции через ostream (в студии, наверное, сделан возможным вывод адреса функции без приведения к bool).

Добавлено через 1 час 18 минут
printf() нормально выводит:
C++
1
printf("%p", MyFunc);
ct0r
Игогошка!
1770 / 672 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
23.10.2013, 15:52 #21
MyFunc и MyFunc[2] для вывода - одно и то же, так как имеют одинаковый тип - указатель на функцию определенного типа, который неявно приведется к bool. Просто MyFunc[2] содержит адрес, смещенный на 2 размера указателя от MyFunc. Поэтому мы можем вызвать MyFunc() и все будет норм, но при вызове MyFunc[2]() мы получим Runtime Error.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
причем при каждом запуске цифры разные
трудно назвать адресами функций(тем более что печать внутри разных функций дает один адрес)
Может это стек
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
23.10.2013, 16:19 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
тем более что печать внутри разных функций дает один адрес
может дело в самой печати?
тогда как же передают функции в качестве параметров, одинаковыми эти "указатели" быть не могут уж точно
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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 я могу использовать и не объявляя как переменную, но при этом объявить переменную с таким именем и объявить еще одну с таким же уже не получается. Хотя объявить одну допускается.
ct0r
Игогошка!
1770 / 672 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
23.10.2013, 19:20 #25
Цитата Сообщение от daslex Посмотреть сообщение
т.е. MyFunc я могу использовать и не объявляя как переменную, но при этом объявить переменную с таким именем и объявить еще одну с таким же уже не получается. Хотя объявить одну допускается.
MyFunc - это никак не переменная, это имя функции, которое в выражениях неявно может приводиться к адресу функции. Имена могут скрываться во вложенной области - int MyFunc скрывает имя функции, отныне имя MyFunc ссылается на переменную типа int. Но в одной и той же области не может быть определено несколько переменных с одним именем. Поэтому потом double MyFunc писать нельзя.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
23.10.2013, 20:10  [ТС] #26
Осталось разобраться зачем преобразование к bool нужно.
я попробовал, не подошло для понимания.
C++
1
2
3
4
5
6
void MyFunc(){}
 
int main()
{
    std::cout<<MyFunc<<" = "<<int(MyFunc)<<"\n";
}
ct0r
Игогошка!
1770 / 672 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
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";
}
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
23.10.2013, 22:04  [ТС] #28
тут параметр-то причем?
указатель в качестве параметра будет иметь другой адрес.
и если имя функции- это имя функции и не переменная
указатель - это не имя функции и является переменной.

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

Добавлено через 1 минуту
в вашем пример ключевой check
ct0r
Игогошка!
1770 / 672 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
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.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
23.10.2013, 23:42  [ТС] #30
нет. непонятно. мне и первый код понятен. но не вижу тесной связи своего вопроса о функции с параметрами функции, даже несмотря на то, что они указывают на одно и то же.
это на притягивание за уши похоже между прочим.

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

Добавлено через 14 минут
это если сделали, значит с какой-то целью.
вот и хотелось бы разобраться с какой целью вообще имя функции преобразовывать в bool, да и в 1 всегда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 23:42
Привет! Вот еще темы с ответами:

нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ? - C++
Здравствуйте.У меня возникла проблема. Помогите пожалуйста!Модуль в понедельник , про таблицы ничего не рассказывали , а преподаватель...

Не пишет по-русски - C++
Ввожу значения переменных на русском языке, а вместо слов непонятные буквы. Что нужно дописать чтобы понимались русские слова? ...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.10.2013, 23:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru