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

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

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

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

22.10.2013, 01:55. Просмотров 1829. Ответов 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++
(*r).sled r - &gt; sled Между ними нет разницы

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

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

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

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

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

Не читается символ 'e' - C++
Вторая проверка просто игнорируется: float i; char c; std::cin &gt;&gt; i &gt;&gt; c; if (c == '$') { i /= 30; } else if (c...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ct0r
Игогошка!
1768 / 670 / 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
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
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
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
23.10.2013, 16:19     Как это читается по-русски #23
Цитата Сообщение от ValeryS Посмотреть сообщение
тем более что печать внутри разных функций дает один адрес
может дело в самой печати?
тогда как же передают функции в качестве параметров, одинаковыми эти "указатели" быть не могут уж точно
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
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
Игогошка!
1768 / 670 / 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,662
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
Игогошка!
1768 / 670 / 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,662
23.10.2013, 22:04  [ТС]     Как это читается по-русски #28
тут параметр-то причем?
указатель в качестве параметра будет иметь другой адрес.
и если имя функции- это имя функции и не переменная
указатель - это не имя функции и является переменной.

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

Добавлено через 1 минуту
в вашем пример ключевой check
ct0r
Игогошка!
1768 / 670 / 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,662
23.10.2013, 23:42  [ТС]     Как это читается по-русски #30
нет. непонятно. мне и первый код понятен. но не вижу тесной связи своего вопроса о функции с параметрами функции, даже несмотря на то, что они указывают на одно и то же.
это на притягивание за уши похоже между прочим.

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

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

И еще раз повторю - имя функции не преобразуется в bool. Оно преобразуется в указатель (который никогда не NULL). А уже указатель - в bool (это определено для любых указателей). А так как указатель будет никогда не NULL, то bool будет всегда true. А оператор вывода выводит true как единицу.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 23:54     Как это читается по-русски #32
Цитата Сообщение от daslex Посмотреть сообщение
отличие имени функции от указателя (который приходит как параметр) в том, что оно всегда, всегда только 1.
насколько я понял.
Фукция всегда имеет не нулевой адрес, поэтому и true (1).
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
23.10.2013, 23:57  [ТС]     Как это читается по-русски #33
я успел исправить функцию на имя функции.

Не по теме:

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



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

Не по теме:

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 01:01     Как это читается по-русски
Еще ссылки по теме:

Криво читается бинарник - C++
Здравия желаю! #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void main() { char l=6,c=3,b; fstream...

Не правильно читается файл - C++
Здравствуйте! Подскажите, пожалуйста, из-за чего у меня не правильно читается файл и как это исправить. void GenerateCSVTable() { ...

Неправильно читается файл - C++
Здравствуйте. Подскажите, пожалуйста. Написал программу, которая создает динамический массив длиной 189кб: BYTE *Massiv; Massiv =...

Не читается txt-файл - C++
Не могу прочитать из файла &quot;readme.txt&quot; Где ошибка? #include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; void main() { ...

Не читается аргумент функции - C++
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 &gt; 1) { std::swap(*str, *(str + len2 - 1)...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 01:01     Как это читается по-русски #36
Цитата Сообщение от daslex Посмотреть сообщение
я успел исправить функцию на имя функции.
Имя функции - это её адрес.
Yandex
Объявления
24.10.2013, 01:01     Как это читается по-русски
Ответ Создать тему
Опции темы

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