Почему я не могу сделать ++ я ++ в подобном языкам C?

SQL Server FTS будет легче справиться для небольшого развертывания. Так как FTS интегрируется с DB, дескрипторы RDBMS, обновляющие индекс автоматически. Довод "против" здесь - то, что у Вас нет очевидного решения для масштабирования за исключением тиражирования DB. Таким образом, если Вы не должны масштабироваться, SQL Server, FTS, вероятно, "более безопасен". С политической точки зрения большинство магазинов будет более довольным чистым решением для SQL Server.

На стороне Lucene, я одобрил бы SOLR по прямому Lucene. С любым решением необходимо сделать больше работы, сами обновляющей индекс, когда данные изменяются, а также отображающиеся данные сами к индексу SOLR/Lucene. Профессионалы - то, что можно легко масштабироваться путем добавления дополнительных индексов. Вы могли выполнить эти индексы на очень минимизированных серверах Linux, который устраняет некоторую стоимость лицензии. Если бы Вы следуете маршрутом Lucene/SOLR, я стремился бы помещать ВСЕ данные, в которых Вы нуждаетесь непосредственно в индекс, вместо того, чтобы отложить указатели на DB в индексе. Можно включать данные в индекс, который не доступен для поиска, так например, Вы, возможно, предварительно создали HTML или XML, сохраненный в индексе, и подаете его как результат поиска. С этим подходом мог снизиться Ваш DB, но Вы все еще можете подать результаты поиска в разъединенном режиме.

я никогда не видел сравнение производительности лицом к лицу SQL Server 2008 и Lucene, но хотел бы видеть тот.

27
задан Grijesh Chauhan 14 August 2013 в 07:21
поделиться

7 ответов

Краткий ответ: i ++ не является «lvalue», поэтому не может быть предметом присвоения.

57
ответ дан 28 November 2019 в 03:58
поделиться

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

18
ответ дан 28 November 2019 в 03:58
поделиться

Хотя короткий ответ «это не lvalue» правильный , возможно, это просто напрашивается вопрос. Почему не является lvalue ? Или, как мы говорим в C #, переменную .

Причина в том, что нельзя есть пирог и есть его тоже . Подумайте логически:

Во-первых, значение оператора ++ в C #, будь то постфиксный или префиксный, это «взять значение этой переменной, увеличить значение, присвоить переменной новое значение, и в результате получить значение ". Значение, полученное в результате, является либо исходным значением, либо увеличенным значением, в зависимости от того, было ли это постфиксом или префиксом. Но в любом случае вы производите ценность.

Во-вторых, значение переменной всегда является текущим содержимым этой переменной . (По модулю некоторые причудливые сценарии потоковой передачи, которые уведут нас далеко.)

Надеюсь, вы согласны с тем, что это совершенно разумные правила.

Теперь должно быть ясно, почему результат i ++ не может быть переменной, но в случае, если он нет, позвольте мне прояснить:

Предположим, что i равно 10. Значение i ++ должно быть таким: «получить значение i - 10 - увеличить его - 11 - сохранить - i теперь 11 - и передать исходный значение в результате - 10 ". Поэтому, когда вы говорите print (i ++), он должен вывести 10, а 11 должно быть сохранено в i.

Теперь предположим, что значение i ++ состоит в том, чтобы вернуть переменную , а не значение . Вы говорите print (i ++) и что происходит? Вы получаете значение i - 10 - увеличиваете его - 11 - сохраняете - i теперь 11 - и в результате возвращаете переменную. Какое текущее значение переменной? 11! Это именно то, что вам НЕ нужно печатать.

Короче говоря, если бы i ++ вернул переменную, то он выполнял бы в точности противоположное предполагаемому значению оператора! Ваше предложение логически непоследовательно, поэтому ни один язык не делает этого таким образом.

84
ответ дан 28 November 2019 в 03:58
поделиться

Я протестировал (++ i, i ++) как обходной путь:

#include <stdio.h> 

int main(){
  int i=0;

  printf(" i:         %i\n", i         );
  printf(" (++i,i++): %i\n", (++i,i++) );
  printf(" i:         %i\n", i         );
}

Результат:


i:         0
(++i,i++): 1
i:         2
8
ответ дан 28 November 2019 в 03:58
поделиться

Из раздела 7.5.9 спецификации C # 3.0 :

Операнд постфиксного приращения или операция декремента должна быть выражение, классифицированное как переменная, a доступ к свойству или доступ к индексатору. Результатом операции является значение того же типа, что и операнд. Если операнд постфиксного приращения или операция декремента - это свойство или доступ к индексатору, свойство или индексатор должен иметь как получение, так и набор аксессуар. Если это не так, compile-time error occurs.

Additionally, the post-increment expression (i++) would be evaluated first because it has a higher precedence than the pre-increment (++i) operator.

3
ответ дан 28 November 2019 в 03:58
поделиться

Потому что результат i ++ не является l-значением.

6
ответ дан 28 November 2019 в 03:58
поделиться

Я считаю, что оператору инкремента (или декремента) нужно присвоить lvalue. Однако ++ i - это не lvalue, это выражение. Кто-нибудь, лучше разбирающийся в компиляторах, может уточнить, есть ли какие-либо технические причины для этого ограничения.

3
ответ дан 28 November 2019 в 03:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: