2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 C++ не могу найти нужную функцию
Сообщение20.09.2009, 07:37 


30/03/09
41
Подскажите ,пожалуйста,кто знает.
Мне нужна функция с++,чтобы вывести просто знак от числа.
например у=-1, вот мне нужно что бы минус выводился.

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 09:40 
Заслуженный участник
Аватара пользователя


03/06/09
1497
if (y<0) ...

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 09:42 
Заслуженный участник


26/07/09
1559
Алматы
Да, можно так: std::cout << (y<0? '-' : '+');

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 15:58 
Заслуженный участник


04/05/09
4582
Или так: std::cout << "+-"[y<0];

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 17:39 


21/03/06
1545
Москва
venco писал(а):
std::cout << "+-"[y<0];

Красиво, сами придумали?

Однако, Вы тут тратите 1 лишний байт (это на архитектуре PC. на других может быть и два, и четыре (!) байта) памяти впустую.

Странно, почему не срабатывает наоборот (ошибка компиляции):
Код:
[y<0]"+-"

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 19:25 
Заслуженный участник


28/04/09
1933
e2e4 в сообщении #245022 писал(а):
Странно, почему не срабатывает наоборот (ошибка компиляции):
Код:
[y<0]"+-"

А почему должно срабатывать? Вроде как индекс элемента массива указывается после наименования (в данном случае, конечно, не наименования, а явного задания/указания) самого массива (собственно, даже не только в C/C++, а практически в любом языке).

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 19:41 
Заслуженный участник
Аватара пользователя


06/10/08
6422
e2e4 в сообщении #245022 писал(а):
Странно, почему не срабатывает наоборот (ошибка компиляции):

А и не должно. Должно срабатывать
Код:
(y<0)["+-"]
И срабатывает.

-- Вс сен 20, 2009 19:44:33 --

EtCetera в сообщении #245061 писал(а):
А почему должно срабатывать? Вроде как индекс элемента массива указывается после наименования (в данном случае, конечно, не наименования, а явного задания/указания) самого массива (собственно, даже не только в C/C++, а практически в любом языке).

Это особая, C-шная магия.
a[b] и b[a] означают одно и то же.

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 19:57 
Заслуженный участник


28/04/09
1933
Xaositect в сообщении #245066 писал(а):
Это особая, C-шная магия.
a[b] и b[a] означают одно и то же.

Надо же, действительно работает. А я и не знал, что такие чудеса бывают... Спасибо! Эта штука из серии мелких приятных неожиданностей.
Интересно, зачем только такое на практике? Впрочем, может быть это из серии префиксных/постфиксных инкрементов и декрементов? Может быть, в таком случае существуют и "перевернутые" скобки - оператор вызова функции? Что-нибудь вроде
Код:
1(sin)

?
Хотя нет, вроде бы не получается...
Все равно не понимаю, зачем это может понадобиться на практике (у "передне-задних" инкрементов/декрементов хоть какие-то отличия есть, причем довольно ощутительные)?

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 20:03 


21/03/06
1545
Москва
Xaositect писал(а):
e2e4 в сообщении #245022 писал(а):
Странно, почему не срабатывает наоборот (ошибка компиляции):

А и не должно. Должно срабатывать
Код:
(y<0)["+-"]
И срабатывает.

Маэстро, снимаю шляпу!

-- Вс сен 20, 2009 20:08:07 --

Цитата:
Все равно не понимаю, зачем это может понадобиться на практике (у "передне-задних" инкрементов/декрементов хоть какие-то отличия есть, причем довольно ощутительные)?

Человек может не знать такого трюка. Но, зная на пятерку синтаксис языка Си, он, в принципе, довольно легко сложит 2 и 2, и предскажет результат такой операции. Я использовал такой вопрос при собеседованни соискателей на должность программиста, можно долго беседовать на одну эту тему и масса вопросов проясняется по кандидату, даже если он сразу не дает правильного ответа (что, в общем-то, не страшно).

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 21:26 
Заслуженный участник


26/07/09
1559
Алматы
2EtCetera
Цитата:
А почему должно срабатывать? Вроде как индекс элемента массива указывается после наименования

Дело в том, что в C/C++ конструкция вида <выражение1> [ <выражение2> ] просто является своеобразным синтаксическим сахаром (i.e. эквивалентна) для конструкции *( ( <выражение1> ) + ( <выражение2> ) ), таким образом странное поведение при индексировании массивов обусловлено коммутативностью оператора + (плюс).

2e2e4
Цитата:
можно долго беседовать на одну эту тему и масса вопросов проясняется по кандидату, даже если он сразу не дает правильного ответа

Бывает, что интервьювер задает какой-нибудь философский вопрос, типа "что такое объект"? И в результате, что бы ты не ответил, все равно дураком окажешься. :)

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 21:38 


21/03/06
1545
Москва
Circiter писал(а):
2e2e4
Цитата:
можно долго беседовать на одну эту тему и масса вопросов проясняется по кандидату, даже если он сразу не дает правильного ответа

Бывает, что интервьювер задает какой-нибудь философский вопрос, типа "что такое объект"? И в результате, что бы ты не ответил, все равно дураком окажешься. :)

Это не ко мне. Да и вообще я привел только пример полезности обозначенного св-ва, и вряд ли обсуждение методов и принципов собеседования будет соответствовать начатой теме.

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение21.09.2009, 00:04 
Заслуженный участник


26/07/09
1559
Алматы
На счет эквивалентности a[b] и *(a+b) я кажется немного погарячился. Они конечно могут восприниматься эквивалентными по смыслу (например при объяснении законности перестановки местами индекса и массива), но нельзя сказать, что первое выражения как бы преобразуется во второе перед их компиляцией (по крайней мере в C++). Более того, если в коде C++ оператор [] перегружен, то тогда конечно только он и будет использоваться, т.е. a[b] будет уже эквивалентно a.operator[](b).

Таким образом получается, что в C++ (в отличии от C) перестановка индексируемого выражения и индекса в квадратных скобках, вообще говоря, бессмысленна (хотя и действует для встроенных типов по правилам C). Поправьте если ошибаюсь.

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение21.09.2009, 00:22 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Стандарт C'99:
Цитата:
6.5.2.1 Array subscripting

Constraints
1 One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall
have integer type, and the result has type ‘‘type’’.

Semantics
2 A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение21.09.2009, 00:38 
Заслуженный участник


26/07/09
1559
Алматы
Глянул в C++ стандарт (под рукой оказался черновик редакции 2003). Там есть вот такие фрагменты: "The expression E1 [E2] is identical (by definition) to *((E1)+(E2))." и "Except where it has been declared for a class (...), the subscript operator [] is interpreted in such a way that E1 [E2] is identical to *((E1)+(E2)). Because of the conversion rules that apply to +, if E1 is an array and E2 an integer, then E1 [E2] refers to the E2-th member of E1. Therefore, despite its asymmetric appearance, subscripting is a commutative operation."

В общем, важна именно фразочка "Except where it has been declared for a class...". :)

 Профиль  
                  
 
 Re: C++ не могу найти нужную функцию
Сообщение27.09.2009, 16:07 
Заслуженный участник


26/07/09
1559
Алматы
2e2e4
Цитата:
тратите 1 лишний байт (это на архитектуре PC. на других может быть и два, и четыре (!) байта) памяти впустую.

А почему? Ну да, строковые литералы соответствуют строкам с завершающим нулем, один символ лишний. Но откуда два лишних байта, а четыре? Вы имели ввиду, что символ может весить больше обычного восьмибитного байта? Или дело здесь в выравнивании? Или в размере указателя (i.e. в разрядности машины)?
Что-то я не соображу никак. :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group