парни подскажите пожалуйста.Какие из прототипов синтаксически правеильны в с++ ?
a) void foo(int x,int y=5 ,int); // не правильный: аргумент со значением по дефолту не последний b)void foo(int,int,int,int y=5); // правильный c)void foo(int x;int y=5 );; // что за точка с запятой? d)void foo(int x,y=5 ); // не правильный: тип y не определен e)void foo(int x,int y= x); // не правильный: значение по дефолту задано некорректно
Это пообще не в тему, поскольку PHP. Но, насколько я помню, в PHP индексы, также как и в C, с нуля. Поэтому $a[1] это символ 2; $a[2] (третий элемент) было 3, а после присваивания стало 2.
Junior
Статус: Не в сети Регистрация: 06.02.2015 Фото: 0
Здравствуйте коллеги. У меня возник интересный и довольно необычный вопрос, прошу помочь менее знающему человеку.
Пришлось из-за "определенных" рамок слезть с visual studio и связаться с mingw. Установка пошла хорошо. Написав часть необходимого кода, решил "просто посмотреть" что есть в этом mingw.
Запустив mingw installation manager решил посмотреть, что есть в настройках и нажал на кнопку Settings.
Что случилось дальше меня очень сильно удивило. А если конкретно то НИЧЕГО и не произошло. Настроек не появилось. Поклацав ещё на эту кнопку пару раз. Я решил чисто из интереса, поставить мингв на другой пк (где кстати установлена ХР). Результат тот же.
Загоревшись целью узнать почему эта кнопку не работает,я провел, почти всё свободное время в поисках на просторах интернета. В результате я ничего так и не нашел!
Помогите мне докопаться до истины и узнать от чего же эта собака в виде настроек в mingw не работает!!! (Прилагаю скриншот менеджера где собственно и есть эти настройки, которые не работают)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
Мужики, только начал учить язык, пока всё ясно только проблема с инкрементом и декрементом, а именно ++а и а++ : Пример: int var =1; int a=0; a = ++var + 1 + ++var*2;
Подскажите логику подсчета, плиз. Я сам насчитал а=7. Правильный ответ 10 (похоже в MS Visual Studio). Сам кодю в Code Blocks, там компилятор minGW (gnu gcc compiler), а он просчитал ответ равный 9. Выбирал в настройках компилятора: visual C++ 2005/2008/2010 - результат тоже 9. Что за нафиг?
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
ReXaN писал(а):
a = ++var + 1 + ++var*2;
Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным. Так что компилятор волен хоть -42 вернуть в ответ на такое.
++var - var увеличивается на единицу ДО использования var++ - var увеличивается ПОСЛЕ
Например (1): int var = 0; if (++var == 1) printf("var дейстаительно равен 1 и мы напечатали эту строку")
Например (2): int var = 0; if (var++ == 0) printf("тут var опять равен единице, но мы сюда тем не менее попали");
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
Herod писал(а):
Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным.
Там такая задачка была. Просто я не разобрался с приоритетами в задачке, а оно вообще вон как... Учтем .
Herod писал(а):
++var - var увеличивается на единицу ДО использования var++ - var увеличивается ПОСЛЕ
Это я понял т.к. приоритет операции ++х выше чем х++
Herod писал(а):
if (++var == 1)
А если ++var == 0, то получим 0? Т.е. сначала будет увеличение на 1, потом приведение к равно 0? А если var++ == 0, то сначала приравнивание к 0, а потом увеличение на 1?
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
ReXaN Если ++var то он сначала увеличит var, а потом будет использовать (в примере - сравнивать) что получилось Если var++ то он сначала использует var (сравнит с нулем) и увеличит когда закончит пользоваться.
Типа, еще пример: int var, a, b; var = 0; a = ++var; var = 0; b = var++; В результате у нас получится a = 1, b = 0, var = 1
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Junior
Статус: Не в сети Регистрация: 20.07.2016 Откуда: Эспоо,Финляндия
Herod писал(а):
Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным.
Это не правда. В приведенном выражении правильный ответ — 9. Нерпавда потому, что согласно пункту 4.1 параграфа 5 стандарта С++ (начиная с 98) поведение является неопределенным в том случае, когда lvalue изменяется более, чем 1 раз между sequence points. Здесь это не так, так как все сайд эффекты преинкремента завершаются прежде, чем начинается вычисление следующего преинкремента.
Цитата:
a = ++var + 1 + ++var*2
Порядок действий будет следующим 1)++var - запишет в var 2 и вернет 2. Промежуточное выражение примет вид: 2 + 1 + ++var*2 2)++var - запишет в var 3 и вернет 3. Промежуточное выражение примет вид: 2 + 1 + 3*2 = 9
Если изменить заданное выражение следующим образом, то результат вычислений окажется неопределенным: var++ + 1 + ++var*2
или так: var = ++var + 1 + ++var*2 — результат снова неопределен
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
lexer42152, почитав материал по ссылке выше, правильный ответ может быть и 10. т.к.
lexer42152 писал(а):
1)++var - запишет в var 2 и вернет 2. Промежуточное выражение примет вид: 2 + 1 + ++var*2 2)++var - запишет в var 3 и вернет 3. Промежуточное выражение примет вид: 2 + 1 + 3*2 = 9
3) окончательное выражение примет вид: 3 + 1 + 3*2 = 10 Первая 3 будет из-за того, что все var могут перезаписаться в 3 после шага 2)
Но я понял, что всё это называется неопределенным поведением и автору задачки не следовало, на мой взгляд, давать её в начале изучения языка, хотя прикольно вышло
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Junior
Статус: Не в сети Регистрация: 20.07.2016 Откуда: Эспоо,Финляндия
ReXaN писал(а):
Первая 3 будет из-за того, что все var могут перезаписаться в 3 после шага 2)
нет, не могут по определению приоритета операций, т.к. операции вычисляются слева направо и ++var - это rvalue, а не lvalue. Неопределенное поведение возникает в случае, когда один и тот же lvalue обновлется более одного раза между двумя точками следования. Выражение ++var + <что-нибудь> определяет точку следования, т.к. все сайд-эффекты ++var завершаются до выполнения операции "+". То же самое с ++var*2. Вот если вы один из преинкременов замените на постинкремент или же присваивать все будете не переменной а, а переменной var, то действительно будет неопределенное поведение. Это довольно тонкий момент и нужно хорошо читать стандарт, чтобы хорошо понимать, что же такое "точка следования". Это часто одно выражение, но не всегда! Задача поставлена корректно, а вот ответ был дан неправильный. В любом случае, это слишком тонкий момент для начинающего.
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
lexer42152 писал(а):
т.к. операции вычисляются слева направо и ++var - это rvalue, а не lvalue. Неопределенное поведение возникает в случае, когда один и тот же lvalue обновлется более одного раза между двумя точками следования.
Всё, я понял! Просто внимательнее мне надо быть, в примере неопределенного поведения на "лурке" тоже было i=5; i = ++i + ++i, а не, например, var = ++i + ++i . Поэтому условие той задачки выше все же получается правильное, но тогда похоже, что компилятор MS Visual Studio (и версия явно была не Express) намудрил с правильным ответом в 10 .
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Junior
Статус: Не в сети Регистрация: 20.07.2016 Откуда: Эспоо,Финляндия
ReXaN писал(а):
Всё, я понял!
Я только что сверился со Стандартом. Судя по всему преинкремент и постинкремент не определяются как точки следования, т.е. я ввел вас в заблуждение, простите Даже в начальной формулировке будет undefined bahavior. Видимо, у GCC есть расширение, которое позволяет придавать значение "осмысленным" случаям, как в вашей формулировке, поэтому он и выдает 9.
Функция на выходе даёт результат в бинарном виде типа "00011011". Нужно разбить его на два куска и модифицировать ими два других байта. Типа так: 00011011 -> ххх11ххх + 000хх011 (х - без изменений). Чё мне вообще гуглить?
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
wandal, звучит как чистые "бинарные операции", но объяснено так, что не понятно почти что ничего. Функция возвращает строку? Какие два других байта, откуда они берутся, они часть результата или что? Этот пример в конце явно требует дополнительных пояснений. Я из интереса попробовал этот текст скинуть 2-м знакомым программистам, они тоже ничего не поняли
unsigned char digit(int a) // это преобразует digit в бинарный вид { switch (a) { case 0 : return 0b11000000; case 1 : return 0b11111001; case 2 : return 0b10100100; case 3 : return 0b10110000; case 4 : return 0b10011001; case 5 : return 0b10010010; case 6 : return 0b10000010; case 7 : return 0b11111000; case 8 : return 0b10000000; case 9 : return 0b10010000; } } PORTB = digit(value%10); // это переводит value в бинарный вид и отправляет байты 7,6,5,4,3,2,1,0 на порт
Нужно как-то переделать последнюю строку. Чтобы было типа так:
Код:
PORTB = digit(value%10????? как?); // отправить байты 7,6,5 и 2,1,0 на порт PORTC = digit(value%10????? как?); // отправить байты 4 и 3 на другой порт
Чтобы можно было выпихнуть часть данных на один порт, и ещё часть на другой порт. Должен же быть какой-то простой оператор для этого. Указатель какие биты использовать.
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
wandal такого оператора в С/С++ не существует, что вам нужно, как я понимаю, это скомбинировать новое значение с существующим и отправить результат на порт Допустим, приёмник PORTC содержит какое-то значение, 8 бит, вы хотите поменять только биты 4 и 3 в нём - для этого нужно взять текущее значение, взять из него биты {7,6,5,2,1,0} и скомбинировать его с тем, что вы получили от digit, взяв из него биты {4,3}, затем результат отправить на PORTC Если именно это нужно, то это просто Возможно, с чем вы работаете, позволяет указывать, какие биты использовать - но непосредственно к С/С++ это уже отношения не имеет. Сам язык этого не позволяет. Можете только менять значение битов с 0 на 1 или наоборот
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
Подскажите толковую книжку по программированию для windows, создания оконных приложений, плиз. Я так понял, что через windows.h можно создать окна в простом IDE, например в Code::Block, в котором я учусь кодить .
"Кьют" платный, может есть аналоги не хуже?
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
ReXaN, если не собираетесь на своём приложении зарабатывать, Qt должен быть бесплатен. А вообще это болезненный вопрос для С++, язык для создания гуя не слишком подходит, из библиотек, Qt, пожалуй, самый лучший вариант из существующих, но назвать его качественным при всём желании нельзя. Нативный гуй из windows.h, WinAPI, это привет из 80-х, смысл на него время тратить? Разве что если совсем что-то простенькое нужно и нет планов создания чего-либо сложнее. Далее, из того, что сам Microsoft предоставляет, MFC, сущий кошмар, к текущему моменту почти что забытый, проходить мимо и не оглядываться Лучше вообще определиться, насколько сложные планируются приложения, нужна ли кроссплатформенность. Какие-то мелкие библиотеки для С++ должны подойти, если требуется что-то простое, в другом случае, для windows лучше присмотреться к C# & WPF
Member
Статус: Не в сети Регистрация: 29.11.2008 Откуда: Санкт-Петербург Фото: 8
Industrialice, как всё сложно... Я пока просто изучаю язык, вот и интересно что и как лучше. MFC в интернете помоему все не хвалят. Есть ещё GTK, WxWidgets, FoxToolkit, которые тоже особо не расхваливают. А так хотел бы написать программку в виде таблицы в несколько колонок и с кучей строк, но с приятным графическим оформлением. Ну ещё хотелось бы создать простенькую игру какой-нибудь платформер.
ПС: Хотел изучить С++, а потом JavaScript.
_________________ Freedom is not free. Rights are not Gifts from Government! Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения