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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
#1

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

29.01.2014, 17:31. Просмотров 2235. Ответов 57
Метки нет (Все метки)

Есть у кого то парочка тем для размышления каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 17:31     Нужен пример того, что работать вроде не должно, но работает
Посмотрите здесь:
Посмотрите пожалуйста программу ,вроде все должно работать ,но что-то не так C++
C++ Как работать с графикой DevC++. Нужен пример
Syntax error хотя вроде быть не должно C++
Должно работать, но выдает ошибку C++
Меню должно снова работать после выбора одного из пунктов C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелки совпадут C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелка на циферблате совпадут C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
06.02.2014, 14:17     Нужен пример того, что работать вроде не должно, но работает #41
programina,
C++11 5.7
When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integral expression. In other words, if the expression P points to the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i + n-th and i − n-th elements of the array object, provided they exist. Moreover, if the expression P points to the last element of an array object, the expression (P)+1 points one past the last element of the array object, and if the expression Q points one past the last element of an array object, the expression (Q)-1 points to the last element of the array object. If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 14:55     Нужен пример того, что работать вроде не должно, но работает #42
Somebody, ниче не понятно. То есть если всего памяти, например 10 байт, и взять адрес несуществующего 11-го байта, то ошибки не будет?
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
06.02.2014, 15:06     Нужен пример того, что работать вроде не должно, но работает #43
Цитата Сообщение от programina Посмотреть сообщение
То есть если всего памяти, например 10 байт, и взять адрес несуществующего 11-го байта, то ошибки не будет?
На низком уровне адрес - это же просто число. Даже если будет переполнение, хуже от этого не станет.
В C++ по стандарту место после конца массива должно быть адресуемое.
BumerangSP
4285 / 1407 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
06.02.2014, 15:14     Нужен пример того, что работать вроде не должно, но работает #44
programina,
Кликните здесь для просмотра всего текста
&a[3]
==
a + 3
То бишь так и выходит: std::list<int>mylist(a, a + 3);

?
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
06.02.2014, 15:32     Нужен пример того, что работать вроде не должно, но работает #45
Цитата Сообщение от programina Посмотреть сообщение
и взять адрес несуществующего 11-го байта, то ошибки не будет?
Взять адрес можно. Но обращаться по нему нельзя. Можно только с этим адресом производить какие-то вычисления.

Если ты возьмёшь адрес 12-го элемента, то в реальности ошибки тоже не будет, но с точки зрения стандарта эта ситуация уже является неопределённой (в то время как для 11-го элемента по стандарту законно)
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 15:36     Нужен пример того, что работать вроде не должно, но работает #46
да я о другом. Может так случиться, что памяти совсем мало, например свободная память на компе почти вся израсходована, и осталось только 10 байт?
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
06.02.2014, 15:44     Нужен пример того, что работать вроде не должно, но работает #47
Цитата Сообщение от programina Посмотреть сообщение
да я о другом. Может так случиться, что памяти совсем мало, например свободная память на компе почти вся израсходована, и осталось только 10 байт?
Допустим, может. Только от того, что 11-й байт находится как бы за пределом физически доступной памяти - ничего не означает. Допустим, у тебя в машине 1000 байт. Тебе ничего не мешает работать с указателем, значение которого равно 1001. Ты можешь его сравнивать, прибавлять, вычитать, но ты не можешь по нему обращаться в память
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 15:48     Нужен пример того, что работать вроде не должно, но работает #48
Evg, сорри, круглое число полезных ответов испортила(на автомате плюсанула), но это то, что я хотела услышать, спасиб)
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.03.2014, 17:30     Нужен пример того, что работать вроде не должно, но работает #49
C++
    if(dx >= 1,570796327) dx = 1,570796327;
Программа работала неадекватно. Оказалось, что у числа скопированного из калькулятора вместо точки запятая, а GCC даже ухом не повел.

зы: наверно в опциях нужно включить -Wall
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
23.03.2014, 18:07  [ТС]     Нужен пример того, что работать вроде не должно, но работает #50
C++
1
if(dx >= 1, "string") dx = 1,570796327;
что дает это запятая?

Добавлено через 1 минуту
т.е как можно применить запятую в if(... , ...)?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.03.2014, 18:08     Нужен пример того, что работать вроде не должно, но работает #51
запятая это оператор и её даже можно перегрузить
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
23.03.2014, 18:10  [ТС]     Нужен пример того, что работать вроде не должно, но работает #52
действительно))
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.03.2014, 20:23     Нужен пример того, что работать вроде не должно, но работает #53
Цитата Сообщение от Хулиган Посмотреть сообщение
что дает это запятая?
Дает сравнение переменной с числом, стоящим до запятой, а потом присваивает переменной число также стоящее перед запятой. Да, это именно запятая, я случайно скопировала ее вместе с числом из калькулятора. Удивило то, что компилятора не показал никаких ошибок или предупреждений (не были включены дополнительные опции компилятора). Нелепость обнаружилась, когда добавила в конец числа букву f - мол, это float.
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
23.03.2014, 20:47  [ТС]     Нужен пример того, что работать вроде не должно, но работает #54
Цитата Сообщение от programina Посмотреть сообщение
Дает сравнение переменной с числом, стоящим до запятой, а потом присваивает переменной число также стоящее перед запятой.
сравнение в числом до запятой работает не верно! результат сравнения всегда true
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
23.03.2014, 21:17     Нужен пример того, что работать вроде не должно, но работает #55
Цитата Сообщение от Хулиган Посмотреть сообщение
результат сравнения всегда true
ну я думаю не всегда, а когда после запятой число не равное 0
Цитата Сообщение от programina Посмотреть сообщение
if(dx >= 1,570796327)
сначала сравнивается с 1
а потом 570796327 приводится к bool в данном случае true
а так должно быть всегда ложь(false)
C++
1
if(dx>=1,0)
но не проверял, так мысли вслух
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.03.2014, 13:12     Нужен пример того, что работать вроде не должно, но работает #56
Цитата Сообщение от Убежденный Посмотреть сообщение
А деструктор-то не виртуальный !
C boost::shared_ptr, кстати, то же самое.
А он и не должен перекрываться.

Добавлено через 4 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
> 1
А где остальное ?
Так и должно быть. Ведь только обычная переменная-массив - это отдельная составная сущность, ассоциированная с указателем, но знающая о количестве своих элементов, а массив-параметр с пустыми скобками - просто указатель. Потому и передаётся размер массива отдельным параметром. Если сразу в заголовке функции декларировать размер, тогда другое дело, тогда функуция будет знать размер массива, но он будет константным.
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,255
Завершенные тесты: 1
24.03.2014, 13:27     Нужен пример того, что работать вроде не должно, но работает #57
Цитата Сообщение от taras atavin Посмотреть сообщение
А он и не должен перекрываться.
Когда первый раз сталкиваешься с использованием shared_ptr на
полиморфных классах, у которых отсутствует виртуальный деструктор,
это поведение немного удивляет. Лично меня удивило, хотя после,
когда я полез в исходники, все стало на свои места.

Цитата Сообщение от taras atavin Посмотреть сообщение
Если сразу в заголовке функции декларировать размер, тогда другое дело, тогда функуция будет знать размер массива...
Не будет:

http://codepad.org/bOPKPoXQ
http://ideone.com/Lk7RMr

> 1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2014, 13:41     Нужен пример того, что работать вроде не должно, но работает
Еще ссылки по теме:
Ошибки вроде бы нет, но работает не правильно! C++
пример из книги не хочет работать. C++
C++ что-то вроде события в консоли
Что-то вроде базы данных C++
C++ Сервер выдаёт неправильный ответ, хотя, вроде, всё работает

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.03.2014, 13:41     Нужен пример того, что работать вроде не должно, но работает #58
Странно, но на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
void show_array(int Arr[10])
{
    int const Size = sizeof (Arr) / sizeof (Arr[0]);
 
    for (int i = 0; i < Size; ++i)
    {
        cout << Arr[i] << endl;
    }
}
 
 
 
int main()
{
    int Array[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    show_array(Array);
    return 0;
}
компил даже не ругается.

Добавлено через 45 секунд
Похоже это тоже просто указатель.

Добавлено через 2 минуты
Вывел на экран sizeof параметра типа массив из десяти чаров, это оказался размер указателя.
Yandex
Объявления
24.03.2014, 13:41     Нужен пример того, что работать вроде не должно, но работает
Ответ Создать тему
Опции темы

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