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

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

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

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

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

Есть у кого то парочка тем для размышления каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен пример того, что работать вроде не должно, но работает (C++):

Посмотрите пожалуйста программу ,вроде все должно работать ,но что-то не так - C++
#include <iostream> using namespace std; int main() { int a,b,c,i,z; c=0; cout<< "enter the number"<< endl; cin >> a; ...

Как работать с графикой DevC++. Нужен пример - C++
Помогите, как поключить граф. драйвера, жду не дождусь когда уже начну работу с графикой. Скиньте нетрудный пример.

Syntax error хотя вроде быть не должно - C++
Ругается на пропущенную ';' хотя она стоит. Output: 1>c:\android\project\proj.win32\gamescene.h(22): error C2146: syntax error :...

Не выводит новое окно, все вроде бы должно работать но не работает - HTML, CSS
Помогите пожалуйста найти ошибку <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> ...

Нужен компаратор или что то вроде того - C#
Код программы у меня очень маленький: String s = File.ReadAllLines("1.txt", Encoding.Default); s = s.AsParallel().OrderBy(x...

Геометрический алгоритм.....что то вроде того - C#
Два отрезка на плоскости заданные целочисельными координатами своих концов в декартовой системе координат. Определить, есть ли у них общая...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
01.02.2014, 18:26 #31
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
В чём может заключаться магия?
вот здесь описано
http://alenacpp.blogspot.ru/2005/11/...ce-points.html
точки следования

Добавлено через 16 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
и только этот показал похожий результат
ой а ссылку то я не вставил
http://www.compileonline.com/compile_cpp_online.php
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
02.02.2014, 01:31 #32
ValeryS,
Кликните здесь для просмотра всего текста
Переменные записываются в те же ячейки памяти. Кстати, ни вызов функции, ни названия переменных роли не играют.
Evg
Эксперт CАвтор FAQ
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
02.02.2014, 18:02 #33
Цитата Сообщение от Kastaneda Посмотреть сообщение
классика жанра
C++
1
std::cout << 0["Hello"] << std::endl;
Ну и немного более сложное:

C
#include <stdio.h>
 
int a[10][20];
 
int main (void)
{
  5[6[a]] = 1;
  return 0;
}
Добавлено через 1 минуту
Пример исходников, которые ведут себя по разному, если их компилировать в режимах Си и Си++
http://www.cyberforum.ru/cpp-experts...tml#post889587
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.02.2014, 08:34 #34
MrGluck,
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
я правда не пробовал с stdcall, когда стек чистит вызываемая функция
в любом случае это "грязный хак"
Evg
Эксперт CАвтор FAQ
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
05.02.2014, 09:25 #35
Что делает данный код и зачем такое кому-нибудь может понадобиться?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
05.02.2014, 13:12 #36
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот не всегда
вызывающая функция может стек почистить после второго вызова и в результате каша
разные компиляторы ведут себя по разному
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова. Поэтому вызов ф-ции здесь действительно не при чем. Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде. Вызов ф-ций может быть вообще исключен и все будет посчитано на регистрах.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
05.02.2014, 13:34 #37
Пока все примеры выше очень даже обьяснимы, но не факт.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.02.2014, 14:15 #38
Цитата Сообщение от Kastaneda Посмотреть сообщение
не важно кто чистит стек (вызываемая / вызывающая), после вызова ф-ции стек должен быть в состоянии как до ее вызова.
да это я увлекся
с аргументами попутал
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому вызов ф-ции здесь действительно не при чем.
очень даже причем
без вызова функции и выделения формальных переменных, мы не можем сдвинуть указатель стека
напрямую с указателем стека Си не работает, даже на уровне ассемблерных вставок( хотя может сейчас может, но раньше обращение к SP блокировалось)
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разные результаты на разных компиляторах / уровнях оптимизации объясняются отличием в конечном коде.
Ну с этим то никто не спорит
Было б странно, если при одном и том же коде( бинарном), были бы разные результаты
"Но одна мысль, одна мысль, тревожит меня"(с) В Каверин "Два капитана"
Qt Cteator выдает такой ответ
15 4199990 5
т.е первый и последний правильно, средний мусор
Что он там со стеком делает?
в ассемблерный листинг не залазил
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.02.2014, 13:45 #39
Вот пример, обьяснимый, но не факт
C++
#include <iostream>
#include <list>
 
int main ()
{
    int a[] = {1,2,3};
 
    std::list<int>mylist(&a[0], &a[3]); // a[3] ?
 
    for (std::list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
}
Добавлено через 12 минут
интересно что будет если у меня только три байта доступной памяти в системе)

Добавлено через 1 минуту
не 3, а 12
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
06.02.2014, 14:00 #40
programina,
Кликните здесь для просмотра всего текста
так end() же возвращает указатель на элемент следующий за последним элементом, а не на последний. Следовательно все верно.
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 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
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
06.02.2014, 15:06 #43
Цитата Сообщение от programina Посмотреть сообщение
То есть если всего памяти, например 10 байт, и взять адрес несуществующего 11-го байта, то ошибки не будет?
На низком уровне адрес - это же просто число. Даже если будет переполнение, хуже от этого не станет.
В C++ по стандарту место после конца массива должно быть адресуемое.
BumerangSP
4286 / 1408 / 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
17627 / 5851 / 376
Регистрация: 30.03.2009
Сообщений: 16,137
Записей в блоге: 26
06.02.2014, 15:32 #45
Цитата Сообщение от programina Посмотреть сообщение
и взять адрес несуществующего 11-го байта, то ошибки не будет?
Взять адрес можно. Но обращаться по нему нельзя. Можно только с этим адресом производить какие-то вычисления.

Если ты возьмёшь адрес 12-го элемента, то в реальности ошибки тоже не будет, но с точки зрения стандарта эта ситуация уже является неопределённой (в то время как для 11-го элемента по стандарту законно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 15:32
Привет! Вот еще темы с ответами:

генерация контента (или что-то вроде того) - PHP
привет :) сейчас буду излагать крайне сумбурно: проблема. есть бесплатный хостинг. narod. безничего. сайты соответственно тоже -...

Посоветуйте какой-либо задачник или что-то вроде того, для усваивания - C#
Начал потихоньку читать &quot;Полное руководство С#4.0&quot;. Но материал с трудом усваивается. Посоветуйте какой-либо задачник или что-то вроде...

Скажите как мне на KeyUp или что-нибудь вроде того обнулить значение нажатой клавиши - JavaScript
Скажите как мне на KeyUp или что-нибудь вроде того обнулить значение нажатой клавиши. Т.е. - объясняю. Надо, чтобы если я в инпуте ...

Вывести строку в обратном порядке с учетом того, что первое слово должно начинаться с большой буквы - C (СИ)
Вывести строку в обратном порядке с учетом того, что первое слово должно начинаться с большой буквы.


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

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

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