Разница между + и + в C? - PullRequest
       3

Разница между + и + в C?

2 голосов
/ 25 ноября 2010

У меня был вопрос,

В чем разница между / + и просто +?

В моей программе у меня была эта строка кода

md_addr_t GSharePC = PC >> (PC_ZERO_BITS/* + (int)log2(Tournament_Counters)*/) & (Tournmanet_GShare_PHT_Entries - 1);

однако, когда я пошел к комментарию, я случайно оставил первый / в так, как

md_addr_t GSharePC = PC >> (PC_ZERO_BITS/ + (int)log2(Tournament_Counters)) & (Tournmanet_GShare_PHT_Entries - 1);

это должно было быть просто

md_addr_t GSharePC = PC >> (PC_ZERO_BITS + (int)log2(Tournament_Counters)) & (Tournmanet_GShare_PHT_Entries - 1);

В чем разница между выполнением / +а также / ?это на самом деле делить потом добавить?и если да, то что это делит на точно?Любая ясность будет оценена.Мне интересно, потому что использование / + на самом деле дало лучшие результаты для программы, которую я запускаю, чем просто + сделал.

Ответы [ 6 ]

7 голосов
/ 25 ноября 2010

+ является двоичным оператором (сложение) и унарным оператором (противоположность отрицанию).

Ваша вторая строка анализируется как

(PC_ZERO_BITS / (+(int)log2(Tournament_Counters))) & (Tournmanet_GShare_PHT_Entries - 1)
3 голосов
/ 25 ноября 2010

Не на каждом языке есть унарный оператор +, и в большинстве из них это не работает. Иногда, однако, он будет выполнять такие действия, как преобразование строки в число во многом так же, как "string" + 0 в некоторых языках. В Ruby есть тщательно разработанный синтаксический анализатор, который анализирует, является ли конец строки маркером конца оператора или нет, поэтому унарный символ + может действовать, чтобы продолжить оператор на другой строке.

С перегрузкой оператора все может быть возможно.

Но вернемся к C99, унарный оператор + делает только одно: он применяет целочисленные повышения . Так как это могло бы произойти в любом случае, если бы операнд использовался в выражении, можно представить, что унарный + находится в C просто для симметрии с унарным -.

Трудно увидеть это в действии, потому что промо-акции так широко применяются. Я придумал это:

printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));

который (на моем mac) печатает

1
4
3 голосов
/ 25 ноября 2010

Во втором случае + используется как унарный положительный оператор .

Знаки

+ и - могут использоваться как двоичные или унарные операторы в зависимости от их контекста и приоритета оператора.

- для обозначения отрицательного числа, а + для обозначения положительного числа. + используется реже, поскольку целочисленный литерал по умолчанию положительный . Так делаем:

printf("Hello %d", + 5);

Эквивалентно:

printf("Hello %d", 5);

Вот почему ваш код компилируется.

1 голос
/ 25 ноября 2010

Он рассматривается как (PC_ZERO_BITS)/(+ (int)log2(Tournament_Counters)), поэтому вы делите вместо +. Возможно, вы захотите прочитать о приоритетах операторов . Если вы можете объяснить, что значит «лучше» ...

1 голос
/ 25 ноября 2010

В этом:

PC_ZERO_BITS/ + (int)log2(Tournament_Counters)

+ является унарным +, так что вы можете удалить его.

1 голос
/ 25 ноября 2010

Насколько я понимаю, вы не удалили комментарий, а именно /* comment */.
Вы удалили только звездочку * и оставили косую черту /.
Итак,в основном, вы делитесь сейчас, а + сейчас (как сказали другие ответы) просто одинарное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...