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

Нужен пример того, что работать вроде не должно, но работает - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
29.01.2014, 17:31     Нужен пример того, что работать вроде не должно, но работает #1
Есть у кого то парочка тем для размышления каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 17:31     Нужен пример того, что работать вроде не должно, но работает
Посмотрите здесь:

где можно скачать программу для того что бы начать учиться работать в С++ C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелки совпадут C++
пример из книги не хочет работать. C++
Ошибки вроде бы нет, но работает не правильно! C++
Должно работать, но выдает ошибку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
29.01.2014, 19:32     Нужен пример того, что работать вроде не должно, но работает #2
Пример 1 (C++11)
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
#include <iostream>
#include <memory>
 
 
 
using namespace std;
 
 
 
struct parent
{
    ~parent()
    {
        cout << "~parent" << endl;
    }        
};
 
 
 
struct child : public parent
{
    ~child()
    {
        cout << "~child" << endl;
    }
};
 
 
 
int main()
{
    std::shared_ptr<parent> Parent(new child());
    return 0;
}
Кликните здесь для просмотра всего текста

> ~child
> ~parent
А деструктор-то не виртуальный !
C boost::shared_ptr, кстати, то же самое.




Пример 2
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
#include <iostream>
 
 
 
using namespace std;
 
 
 
void show_array(int Arr[])
{
    int const Size = sizeof (Arr) / sizeof (Arr[0]);
    
    for (int i = 0; i < Size; ++i)
    {
        cout << Arr[i] << endl;
    }
}
 
 
 
int main()
{
    int Array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    show_array(Array);
    return 0;
}
Кликните здесь для просмотра всего текста

> 1
А где остальное ?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
29.01.2014, 19:52     Нужен пример того, что работать вроде не должно, но работает #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Убежденный, к первому:
Кликните здесь для просмотра всего текста
На память по рабоче-крестьянски: вроде бы в этих указателях для освобождения памяти используется спецфункция-deleter. Соответственно, легко параметризовать ее и освобождать память, выделенную под конкретный тип, а не через указатель на базовый класс. "Садись, три"?)


Добавлено через 1 минуту
Ко второму:
Кликните здесь для просмотра всего текста
а есть ли разница между void f(int* arr) и void f(int arr[]). Кажется, эквивалентны.


Добавлено через 3 минуты
От меня пример (pure c)
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 <stdio.h>
 
typedef struct
{
    char str[4];
    int num;
} NumberRepr;
 
void format(NumberRepr* number)
{
    sprintf(number->str, "%4d", number->num);
}
 
int main()
{
    NumberRepr number = { .num = 1025 };
 
    format(&number);
 
    printf("str: %s\n", number.str);
    printf("num: %d\n", number.num);
 
    return 0;
}
Кликните здесь для просмотра всего текста
str: 1025
num: 1024

Стоп, так ведь мы num не меняли?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
29.01.2014, 19:54     Нужен пример того, что работать вроде не должно, но работает #4
ну вот параллельная тема
Обмен переменных через XOR - тонкости
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
29.01.2014, 19:55  [ТС]     Нужен пример того, что работать вроде не должно, но работает #5
ооо порядочек, спасибо
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
29.01.2014, 19:58     Нужен пример того, что работать вроде не должно, но работает #6
Цитата Сообщение от Убежденный Посмотреть сообщение
А где остальное ?
а вот здесь
Цитата Сообщение от Убежденный Посмотреть сообщение
sizeof (Arr) / sizeof (Arr[0]
здесь взял размер указателя sizeof (Arr)
и разделил на размер элемента, а они совпадают
сделай массив char и может 4 циферки выведет(а может не выведет)
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
29.01.2014, 20:02  [ТС]     Нужен пример того, что работать вроде не должно, но работает #7
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот здесь
Сообщение от Убежденный
sizeof (Arr) / sizeof (Arr[0]
здесь взял размер указателя sizeof (Arr)
и разделил на размер элемента, а они совпадают
сделай массив char и может 4 циферки выведет(а может не выведет)
зачем открыто писать ответ?! я еще не смотрел, а уже не интересно
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
29.01.2014, 20:04     Нужен пример того, что работать вроде не должно, но работает #8
вот еще
C++
1
a=++b=++c=5;
что будет в a?


Добавлено через 53 секунды
Хулиган,
так ты бы так и сказал что хочешь сам разобраться
Хулиган
29.01.2014, 20:07  [ТС]
  #9

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
так ты бы так и сказал что хочешь сам разобраться
а я тему именно для вас создал?
если есть ответ подписывайте ОТВЕТ и скрытым текстом, мб кому то будет интересно тоже подумать

Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
29.01.2014, 20:40     Нужен пример того, что работать вроде не должно, но работает #10
Цитата Сообщение от 0x10 Посмотреть сообщение
На память по рабоче-крестьянски: вроде бы в этих указателях для освобождения памяти используется спецфункция-deleter.
0x10, не забываем, мы в разделе для начинающих.
RussDragon
 Аватар для RussDragon
12 / 12 / 1
Регистрация: 08.04.2012
Сообщений: 81
29.01.2014, 22:36     Нужен пример того, что работать вроде не должно, но работает #11
Цитата Сообщение от Убежденный Посмотреть сообщение
0x10, не забываем, мы в разделе для начинающих.
А разве Смартпоинтеры это что-то сложное?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
29.01.2014, 22:49     Нужен пример того, что работать вроде не должно, но работает #12
О shared_ptr по рабоче-крестьянски

C++
1
2
template<class Y> explicit shared_ptr(Y* p);
^^^^^^^^^^^^^^^^^
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
29.01.2014, 23:08     Нужен пример того, что работать вроде не должно, но работает #13
классика жанра
C++
1
std::cout << 0["Hello"] << std::endl;
ну или если хочется совсем запутать потенциального противника, то
C++
1
std::cout << (long("Hello") ^ long("Hello")) ["Hello"] << std::endl;
или вот еще (сия магия уже обсуждалась в теме для экспертов)
C++
1
2
const volatile char* ptr = "Hello";
std::cout << ptr << std::endl;
вывод: 1
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
29.01.2014, 23:58     Нужен пример того, что работать вроде не должно, но работает #14
Цитата Сообщение от 0x10 Посмотреть сообщение
Стоп, так ведь мы num не меняли?
Кликните здесь для просмотра всего текста
Менять не меняли, а за предела массива ушли.


Добавлено через 8 минут

Не по теме:

Kastaneda, а где обсуждался последний вариант из 13-го поста? Поделись ссылкой.

BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
30.01.2014, 00:03     Нужен пример того, что работать вроде не должно, но работает #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
std::cout << 0["Hello"] << std::endl;
Кликните здесь для просмотра всего текста
Не имеет значения, что именно в скобках: 0 или hello, т.к. скобки - удобный синтаксис.
Эквиваленты:
C++
1
2
"Hello"[0]; // первый символ строкового литерала
*("Hello" + 0); // более общее
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
30.01.2014, 01:01  [ТС]     Нужен пример того, что работать вроде не должно, но работает #16
в попытках разобраться в некоторых примерах нашел еще один:

C++
1
2
3
typedef int Foo;
int i = 42;
i.~Foo();
а так нельзя:
C++
1
2
int i = 42;
i.~int();
ответ еще не знаю

Добавлено через 23 минуты
афигеть....полез узнавать за умные указатели которые появились в С++11, а там столько всякой крутатени
аж настроение поднялось
Kastaneda
30.01.2014, 08:51
  #17

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Kastaneda, а где обсуждался последний вариант из 13-го поста? Поделись ссылкой.
Вот здесь, начиная со второго поста.

RussDragon
 Аватар для RussDragon
12 / 12 / 1
Регистрация: 08.04.2012
Сообщений: 81
30.01.2014, 08:59     Нужен пример того, что работать вроде не должно, но работает #18
Цитата Сообщение от Хулиган Посмотреть сообщение
Добавлено через 23 минуты
афигеть....полез узнавать за умные указатели которые появились в С++11, а там столько всякой крутатени
аж настроение поднялось

Не по теме:

Как я помню, Смартопоинтеры появились раньше C++11, но часть их ввели именно в нем.

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
30.01.2014, 09:14     Нужен пример того, что работать вроде не должно, но работает #19
Цитата Сообщение от Хулиган Посмотреть сообщение
ответ еще не знаю
достаточно посмотреть в Стандарт:
Нужен пример того, что работать вроде не должно, но работает

то же самое, например и с шаблонами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template < typename T >
struct X {
   X () {
      x.~T() ;
   }
   int x ;
} ;
 
 
int main()
{
   X<int> x ;
}
псевдо-деструктор
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 09:19     Нужен пример того, что работать вроде не должно, но работает
Еще ссылки по теме:

Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелка на циферблате совпадут C++
C++ Как работать с графикой DevC++. Нужен пример
Syntax error хотя вроде быть не должно C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
30.01.2014, 09:19     Нужен пример того, что работать вроде не должно, но работает #20
О псевдо-деструкторе:
Нужен пример того, что работать вроде не должно, но работает
Yandex
Объявления
30.01.2014, 09:19     Нужен пример того, что работать вроде не должно, но работает
Ответ Создать тему
Опции темы

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