2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 C++ не могу найти нужную функцию
Сообщение20.09.2009, 07:37 
Подскажите ,пожалуйста,кто знает.
Мне нужна функция с++,чтобы вывести просто знак от числа.
например у=-1, вот мне нужно что бы минус выводился.

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 09:40 
Аватара пользователя
if (y<0) ...

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 09:42 
Да, можно так: std::cout << (y<0? '-' : '+');

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 15:58 
Или так: std::cout << "+-"[y<0];

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 17:39 
venco писал(а):
std::cout << "+-"[y<0];

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

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

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 19:25 
e2e4 в сообщении #245022 писал(а):
Странно, почему не срабатывает наоборот (ошибка компиляции):
Код:
[y<0]"+-"

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 19:41 
Аватара пользователя
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 
Xaositect в сообщении #245066 писал(а):
Это особая, C-шная магия.
a[b] и b[a] означают одно и то же.

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

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 20:03 
Xaositect писал(а):
e2e4 в сообщении #245022 писал(а):
Странно, почему не срабатывает наоборот (ошибка компиляции):

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

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

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

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

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 21:26 
2EtCetera
Цитата:
А почему должно срабатывать? Вроде как индекс элемента массива указывается после наименования

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

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

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение20.09.2009, 21:38 
Circiter писал(а):
2e2e4
Цитата:
можно долго беседовать на одну эту тему и масса вопросов проясняется по кандидату, даже если он сразу не дает правильного ответа

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

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение21.09.2009, 00:04 
На счет эквивалентности a[b] и *(a+b) я кажется немного погарячился. Они конечно могут восприниматься эквивалентными по смыслу (например при объяснении законности перестановки местами индекса и массива), но нельзя сказать, что первое выражения как бы преобразуется во второе перед их компиляцией (по крайней мере в C++). Более того, если в коде C++ оператор [] перегружен, то тогда конечно только он и будет использоваться, т.е. a[b] будет уже эквивалентно a.operator[](b).

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

 
 
 
 Re: C++ не могу найти нужную функцию
Сообщение21.09.2009, 00:22 
Аватара пользователя
Стандарт 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 
Глянул в 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 
2e2e4
Цитата:
тратите 1 лишний байт (это на архитектуре PC. на других может быть и два, и четыре (!) байта) памяти впустую.

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

 
 
 [ Сообщений: 22 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group