Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 14:55     Нужен пример того, что работать вроде не должно, но работает #42
Somebody, ниче не понятно. То есть если всего памяти, например 10 байт, и взять адрес несуществующего 11-го байта, то ошибки не будет?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
06.02.2014, 15:06     Нужен пример того, что работать вроде не должно, но работает #43
Цитата Сообщение от programina Посмотреть сообщение
То есть если всего памяти, например 10 байт, и взять адрес несуществующего 11-го байта, то ошибки не будет?
На низком уровне адрес - это же просто число. Даже если будет переполнение, хуже от этого не станет.
В C++ по стандарту место после конца массива должно быть адресуемое.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
06.02.2014, 15:32     Нужен пример того, что работать вроде не должно, но работает #45
Цитата Сообщение от programina Посмотреть сообщение
и взять адрес несуществующего 11-го байта, то ошибки не будет?
Взять адрес можно. Но обращаться по нему нельзя. Можно только с этим адресом производить какие-то вычисления.

Если ты возьмёшь адрес 12-го элемента, то в реальности ошибки тоже не будет, но с точки зрения стандарта эта ситуация уже является неопределённой (в то время как для 11-го элемента по стандарту законно)
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 15:36     Нужен пример того, что работать вроде не должно, но работает #46
да я о другом. Может так случиться, что памяти совсем мало, например свободная память на компе почти вся израсходована, и осталось только 10 байт?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
06.02.2014, 15:44     Нужен пример того, что работать вроде не должно, но работает #47
Цитата Сообщение от programina Посмотреть сообщение
да я о другом. Может так случиться, что памяти совсем мало, например свободная память на компе почти вся израсходована, и осталось только 10 байт?
Допустим, может. Только от того, что 11-й байт находится как бы за пределом физически доступной памяти - ничего не означает. Допустим, у тебя в машине 1000 байт. Тебе ничего не мешает работать с указателем, значение которого равно 1001. Ты можешь его сравнивать, прибавлять, вычитать, но ты не можешь по нему обращаться в память
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 15:48     Нужен пример того, что работать вроде не должно, но работает #48
Evg, сорри, круглое число полезных ответов испортила(на автомате плюсанула), но это то, что я хотела услышать, спасиб)
programina
 Аватар для programina
1912 / 597 / 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
Каратель
Эксперт C++
6543 / 3963 / 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
 Аватар для programina
1912 / 597 / 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
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
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
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.03.2014, 13:12     Нужен пример того, что работать вроде не должно, но работает #56
Цитата Сообщение от Убежденный Посмотреть сообщение
А деструктор-то не виртуальный !
C boost::shared_ptr, кстати, то же самое.
А он и не должен перекрываться.

Добавлено через 4 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
> 1
А где остальное ?
Так и должно быть. Ведь только обычная переменная-массив - это отдельная составная сущность, ассоциированная с указателем, но знающая о количестве своих элементов, а массив-параметр с пустыми скобками - просто указатель. Потому и передаётся размер массива отдельным параметром. Если сразу в заголовке функции декларировать размер, тогда другое дело, тогда функуция будет знать размер массива, но он будет константным.
Убежденный
Системный программист
 Аватар для Убежденный
14197 / 6212 / 985
Регистрация: 02.05.2013
Сообщений: 10,348
Завершенные тесты: 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++ Как работать с графикой DevC++. Нужен пример
Syntax error хотя вроде быть не должно C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для 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     Нужен пример того, что работать вроде не должно, но работает
Ответ Создать тему
Опции темы

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