Программирование - это просто

sami

Местный
Хорош затягивать интригу. Вот оно:
Код:
int val=2;
*val=3;
cout << 2*2;
Некоторые недоразвитые компиляторы первым оператором эквивалентят переменную и константу, в результате чего после второго оператора константа "2" принимает значение "3".
Сей нелепостью грешат все компиляторы С (не С++!) от Мелкософта.
Давай-те ка еще раз вернемся к этому оригинальному куску кода. На каком вы говорите языке его написали? На C? Повторяюсь в C нет перегрузки операторов и потоков вывода.
Если не брать во внимание вывод значения в консоль, то стэйтмент *val = 3; - тоже не валидное для типа int.
Сначала я подумал что мало-ли, я ведь не знакок C, может быть вдруг C при разыменовании переменной целого типа приводит ее к указателю (не мог же фокусник написать невалидный код!). Оказалось что нет, C такое не делает и разыменовывать переменные целого типа не желает.

Код:
prog.c:5:2: error: invalid type argument of unary ‘*’ (have ‘int’)
  *val=3;
  ^

Но если бы C пожелал это сделать, то смысл стейтмента *val = 3; я бы прочитал как "положить значение 3 по адресу 2", или расписать чужую память, что есть UB. Но я приврал, UB не будет, т.к. этот код не компилится.

Константа здесь ни при чем. И никому она тут не нужна.
Во втором операторе - меняется значение переменной по ссылке. - Это так должно быть по описанию языка.
В описании языка (в спецификации) нет понятия "ссылка".
Вот и получается, что
*val=3; будет выполнено как *pval=3; - с2 стало равно "3".
Ну, и далее в том же духе:
оператор вывода (последний) превратится в cout << (*pc2)*(*pc2) и напечатает "9".
И никаких UB. Просто не надо эквивалентитить служебную ссылку на переменную со служебной ссылкой на константу.
Получается что *val = 3; выполнено не будет, ибо до выполнения дело не дойдет благодаря ошибке компиляции.
И оператор вывода (что за оператор такой?) ни во что не превратится, ибо ни оператора вывода, ни потока вывода в C не существует.
 

tomcat

far away...
Команда форума
Мульти модератор
Товарищу Arkad, видимо, нечем заняться. Вместо изучения новых технологий ищет косяки в старых.
Я вот что скажу, поддержав старого оппонента, пропагандирующего ассемблер. Вам (аркад) знаком zx-spectrum? На нём возможен вывод картинки на экран с использованием эффекта под названием multicolor, который в принципе не подразумевали создатели микросхемы ULA. Если вам не ясно о чём речь, то просто проигнорируйте дальнейший вопрос, если да, то по вашему мнению люди, его использовавшие, хотели показать косяк авторов железа или всё-таки обратившие его на благо платформы?
 

Arkad

Местный
Вместо изучения новых технологий ищет косяки в старых.
Последним на этот прием был взят компилятор из MS VS-2008. 10-ка в наличии есть, но попробовать ее так и не довелось.
Это еще не технологии. Просто инструмент.
Или вы ратуете за пользование инструментом "вслепую" - не зная его особенностей и косяков?
 

tomcat

far away...
Команда форума
Мульти модератор
Последним на этот прием был взят компилятор из MS VS-2008. 10-ка в наличии есть, но попробовать ее так и не довелось.
Это еще не технологии. Просто инструмент.
Или вы ратуете за пользование инструментом "вслепую" - не зная его особенностей и косяков?
Если не пытаться целенаправленно загнать инструмент в тупик, то меня по большей части устраивает его поведение. Критика в адрес MS в основном в том, что они, борясь за безопасность, не предлагают внятных решений по обратной совместимости для проектов, написанных в более старых версий студий. Например, проблема многочисленных переопределений типов данных - WORD не равно WCHAR, хотя в основе unsigned short. Впрочем, это проблема не только мелкомягких. И, надо признать, в той же платформе .NET они решили этот вопрос. Но это уже не ц++.
 

sami

Местный
Последним на этот прием был взят компилятор из MS VS-2008. 10-ка в наличии есть, но попробовать ее так и не довелось.
Вы хотите сказать что компилятор из vs 2008 скомпилировал ваш фокус и позволил разыменовать целое?
 

Arkad

Местный
Вы хотите сказать что компилятор из vs 2008 скомпилировал ваш фокус и позволил разыменовать целое?
Да, не д.б. там никакого разыменования! Очепятка! Звездочка такая мелкая, что я ее проглядел, не увидел сразу.
Должно быть просто
Код:
val=3;
 

sami

Местный
Да, не д.б. там никакого разыменования! Очепятка! Звездочка такая мелкая, что я ее проглядел, не увидел сразу.
Должно быть просто
Код:
val=3;
Такая мелкая, что вы обчепятались аж дважды (тут и тут).
Хорошо. Принимая во внимание вашу очепятку, ваш фокус меняет статус из "невероятного" в "сверхъестественный". Пока я не увижу соответствующий подтвержденный bug-report, буду считать что вы пытаетесь пудрить мозги, тем более что неоднократные указания на эту версию уже были.
 

Arkad

Местный
упорно пытаетесь засунуть пергрузку операторов в C.
Перегрузку я нигде не предъявлял, а использование cout - только для примера, что любой вывод выражения 2*2 даст не "4". Я не предлагаю писать в С про cout, и нарваться на ошибку синтаксиса. В самом первом посте я писал, что выводить можно хоть принтфом, хоть присвоить переменной, и отладчиком посмотреть. Суть в том, что "2" не всегда есть два. Вот и все.
 

sami

Местный
Перегрузку я нигде не предъявлял, а использование cout - только для примера, что любой вывод выражения 2*2 даст не "4". Я не предлагаю писать в С про cout, и нарваться на ошибку синтаксиса.
Выдаете перлы в каждом посте. Стэйтмент cout << 2*2; не является синтаксической ошибкой в C. Это легко показать, приведя работающую программу на C с таким кодом. Впрочем, вы наверное снова опечатались, слово "синтаскической" такое маленькое...

В самом первом посте я писал, что выводить можно хоть принтфом, хоть присвоить переменной, и отладчиком посмотреть. Суть в том, что "2" не всегда есть два. Вот и все.
Без баг-репорта или хоть какого-нибудь пруфа это не суть, а ваша вера. Вопросы веры обсуждают в "Теологии".
 

maxx

Активный пользователь
Sami только не про веру! Сейчас тролль почует свежую кровь.
 

sami

Местный
Sami только не про веру! Сейчас тролль почует свежую кровь.
Ушел походу в "Теологию". Там фокусы не предметные, но духовные. Не доскребешься с баг-репортом.

А я тем временем закину удочку о нативном дотнете
Microsoft .NET Native
 

maxx

Активный пользователь
Sami подскажи plz (делаю первые шаги в C++), почему вот такая конструкция работает (в бесконечном цикле):
Game::Game() // конструктор
: mWindow(sf::VideoMode(640, 480), "SFML Application")
, mPlayer()
{
// какой то код
}

А вот такая уже нет (программа не зацикливается, выходит по return 0)

Game::Game() // конструктор
{
mWindow(sf::VideoMode(640, 480), "SFML Application");
mPlayer();

// какой то код
}


Main.cpp:
int main()
{
Game game;
game.run();
}

Не совсем понимаю чем отличается инициализация в 2х вариантах.
 

sami

Местный
Sami подскажи plz (делаю первые шаги в C++), почему вот такая конструкция работает (в бесконечном цикле):

Не совсем понимаю чем отличается инициализация в 2х вариантах.
Не специалист в плюсах, но попробую.
http://stackoverflow.com/questions/22927849/c-sfml-member-intializer
 
  • Like
Реакции: maxx

CoderA

Местный
почему вот такая конструкция работает (в бесконечном цикле):
Game::Game() // конструктор
: mWindow(sf::VideoMode(640, 480), "SFML Application")
, mPlayer()
{
// какой то код
}

А вот такая уже нет (программа не зацикливается, выходит по return 0)

Game::Game() // конструктор
{
mWindow(sf::VideoMode(640, 480), "SFML Application");
mPlayer();

// какой то код
}


Main.cpp:
int main()
{
Game game;
game.run();
}

Не совсем понимаю чем отличается инициализация в 2х вариантах.

При использовании списка инициализации (первый способ) поля инициализируются в порядке описания, а не в том порядке, в котором они указаны в списке. Следовательно загляни в header и посмотри в каком именно порядке определены поля mWindow и mPlayer.

Пример от автора библиотеки.

https://github.com/LaurentGomila/SF...ok/blob/master/01_Intro/Include/Book/Game.hpp
https://github.com/LaurentGomila/SFML-Game-Development-Book/blob/master/01_Intro/Source/Game.cpp
 
  • Like
Реакции: maxx

sami

Местный
При использовании списка инициализации (первый способ) поля инициализируются в порядке описания, а не в том порядке, в котором они указаны в списке.
Верно, но причина скорее в том, что во втором случае вместо оператора присваивания (коим должны инициироваться мемберы в теле конструктора) используется function call синтаксис, которым должны инициализироваться поля в списке инициализации. Т.е. во втором случае инициализации не происходит.
 
Сверху