Почему языки C требуют parens вокруг простого условия в если оператор?

Потому что это говорит EF, что поле внешнего ключа , используемое для хранения идентификатора связанной записи «Users», называется «Users_ID».
Если вам явно не нужно, чтобы это поле было доступно в вашей Sims сущности, то вы можете просто полностью его исключить & amp; вам вообще не нужно иметь атрибут ForeignKey & amp; EF справится с этим за кулисами.

В качестве альтернативы, вы можете назвать поле внешнего ключа «UsersId», и оно будет предполагать, что это внешний ключ из-за соглашения.

Так что с любым из них должно быть все в порядке:

//no explicit foreign key
public class Sims
{
    public int ID { get; set; }
    public Users Users { get; set; }
}

//explicit foreign key but EF works it out via convention
public class Sims
{
    public int ID { get; set; }
    public int UsersId { get; set; }
    public Users Users { get; set; }
}

//explicitly named foreign key which is named differently from 
//convention so needs to be pointed at.  note nameof() operator
//which will give a compiler error should you rename it, so is
//better than a magic string
public class Sims
{
    public int ID { get; set; }

    [ForeignKey(nameof(Users))]
    public int MyUsersFkField { get; set; }        
    public Users Users { get; set; }
}

Вы также можете добавить атрибут к свойству Users и указать его в поле Id.

Важным примечанием является то, что если вы используете свойство FK с нетрадиционным названием и вообще не задают внешний ключ , то EF создаст поле FK UsersId в базовой базе данных используйте это (но это не будет выставлено в вашей модели)

28
задан 10 revs, 6 users 82% 22 August 2011 в 22:44
поделиться

12 ответов

Я не мог потратить больше времени на это. Я просто изменил разделитель аргументов, включив в него также точку с запятой (;), так что я могу использовать его вместо амперсанда:

#cat .htaccess
php_value arg_separator.input "&;"
-121--5086389-

Вы хотите пройти через все перестановки, или подсчитать количество перестановок?

Для первого используйте std:: next _ permutation , как предлагают другие. Каждая перестановка занимает время O (N) (но менее амортизированное время) и не требует памяти, кроме ее фрейма вызова, времени vs O (N) и памяти O (N) для рекурсивной функции. Весь процесс является O (N!) и вы не можете сделать лучше, чем это, как другие сказали, потому что вы не можете получить больше, чем O (X) результатов от программы за менее чем O (X) время! Без квантового компьютера.

Для последнего нужно просто знать, сколько уникальных элементов в последовательности.

big_int count_permutations( string s ) {
    big_int divisor = 1;
    sort( s.begin(), s.end() );
    for ( string::iterator pen = s.begin(); pen != s.end(); ) {
        size_t cnt = 0;
        char value = * pen;
        while ( pen != s.end() && * pen == value ) ++ cnt, ++ pen;
        divisor *= big_int::factorial( cnt );
    }
    return big_int::factorial( s.size() ) / divisor;
}

Скорость ограничена операцией поиска повторяющихся элементов, которая для char s может быть выполнена за O (N) раз с помощью таблицы поиска.

-121--1046033-

Если нет скобок вокруг выражений в , если конструкции, то каково было бы значение следующего утверждения?

if x * x * b = NULL;

Это

if (x*x)
    (*b) = NULL;

или это

if (x)
    (*x) * b = NULL;

(конечно, это глупые примеры и даже не работают по понятным причинам, но вы получаете смысл)

TLDR: Скобки требуются в C до

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

Я не могу вспомнить какие-либо конкретные случаи, когда пропуск паренов на самом деле вызвал бы двусмысленность, но, возможно, где-то есть угловой случай.

Это может быть связано с локально объявленными переменными (как в if (bool b = foo())..., где без скобок было бы сложнее определить, является ли bool объявлением типа или полным условием. ] будет первым токеном тела if-операторов, а не частью условия.

-2
ответ дан jalf 28 November 2019 в 02:58
поделиться

Фундаментальная причина в том, что у C и друзей нет ключевого слова then, поэтому им нужен другой способ разграничения выражения условия. Языки, такие как Pascal и PL / 1, не нуждаются в скобках. То же самое относится и к «while», где Pascal, PL / 1 и т. Д. Имеют «do».

0
ответ дан 2 revs 28 November 2019 в 02:58
поделиться

Я могу привести, по крайней мере, один пример, почему в C есть парантез вокруг условий,

Например, рассмотрим следующее

while(1) do_something();

. Выше будет вызывать do_something () навсегда в бесконечный цикл

Причина, по которой скобки требуются, заключается в том, что следующее будет неоднозначным

while 1 ; do_something();, значит ли это, оценивать do_something и ничего не делать в цикле while? или это означает то же самое, что и в примере кода выше?

Я предполагаю, что это показывает один из способов, почему в синтаксисе C скобки требуются для оценки условий, и, расширяя тот же синтаксис (для удобства), он распространяется на операторы if.

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

-1
ответ дан hhafez 28 November 2019 в 02:58
поделиться

Еще одна возможная вещь, которую следует иметь в виду: C был создан в то время, когда хранилище на магнитной ленте было обычным, поэтому случайный поиск или обратный просмотр текущего файла или даже других файлов не был реально осуществим (что также объясняет, почему вы должны помещать некоторые вещи (например, предварительные объявления) перед другими вещами (то есть использованием функций), даже если компилятор должен иметь возможность выяснить это самостоятельно).

1
ответ дан Michael Stum 28 November 2019 в 02:58
поделиться

Скажите мне, как объяснить следующее:

if x ++ b;

Выглядит глупо, но ...

if( x ) ++b;

или

if( x++ ) b;

или, возможно, «x» имеет перегруженный оператор, то ...

if( x ++ b){;}

Редактировать:

Как отметил Мартин Йорк, «++» имеет более высокий приоритет, поэтому мне пришлось добавить оператор, перегружающий tidbit. Он абсолютно прав, когда имеешь дело с современными компиляторами до тех пор, пока вы не учтете все то перегруженное качество, которое есть в C ++.

12
ответ дан wheaties 28 November 2019 в 02:58
поделиться

я думаю, что лучший вопрос был бы, "почему мы захотим такую вещь?", чем, "почему у нас нет его?". Это вводит другой в других отношениях ненужный пограничный случай в лексический анализатор, именно так можно постараться не вводить 4 дополнительных символа; и добавляет сложность к спецификации путем разрешения исключений простому синтаксису, который уже поддерживает все возможные случаи очень хорошо. Не говоря уже о подчиняется правилам неоднозначности, которая на языке программирования не имеет большого количества значения.

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

Я думаю, что Вы путаете "скобки" с "скобками"

Это возможно в C:

void doSomething(){}
void doSomethingElse(){}

void main() {
    int val = 0;
    if( val ) 
        doSomething();
    else
        doSomethingElse();
}

Не все языки "C" заставляют использовать паретезу и оставляют скобки как необязательные. Язык программирования Go ( Issue ) делает точно так же напротив.

Правильным способом написания этого же предложения в Задании 9 было бы:

if val {
    doSomething();
} else {
    doSomethingElse();
}

Таким образом, недействительным является следующее:

if x * x * b = NULL; 

Оно должно быть одним из:

if x*x {
    *b=NULL;
}

или если x { xb=NULL; }

Здесь фигурные скобки удаляют неоднозначность, создаваемую отсутствием скобок.

-1
ответ дан 28 November 2019 в 02:58
поделиться

Это просто способ окончания пункта условия утверждения. В других языках используются другие средства, такие как "тогда" или на питонском "if condition :(Followed by a return)". (The : always get me in python I keep leave them out and get errors than isn't immediately obvious in the result.)

Компьютерная грамматика обычно похожа на какой-нибудь уникальный механизм для идентификации различных частей утверждения или выражения. В этом отношении это не лучше и не хуже, чем любой другой язык. Другая проблема с С/С++ - это пример неоднозначности с точки зрения грамматики, и она должна рассматриваться как особый случай, чтобы гарантировать корректную работу. (т.е. добавляет дополнительную работу для реализации компилятора)

.
0
ответ дан 28 November 2019 в 02:58
поделиться

Я бы тоже хотел, чтобы синтаксис, но чтобы избежать Разборные обмена ямами, должны быть этой формы:

для нескольких утверждений:

if val 
{ 
    doSomething();
    doOthers();
}

для одного утверждения:

if val: 
   doSomething();
0
ответ дан 28 November 2019 в 02:58
поделиться

Потому что C позволяет делать:

if (x) { // As opposed to java where you need to do if (x == something)
   // your code
}

Как вы можете видеть выше, гибкость порождает двусмысленность, как показали другие.

-2
ответ дан 28 November 2019 в 02:58
поделиться

, если вы не хотите значительного пробела, вы должны быть в состоянии определить, когда условие заканчивается {{ 1}} в некоторых языках это () вокруг условия, в некоторых это ключевое слово, затем if, подобное тому, что указано в ответе

, если x * x * b = NULL, может быть одно условие, всегда оценивающееся как ложное, другое присваивает null to b в случае (x x) компилятор не имеет возможности узнать, когда условие заканчивается и начинается следующая операция. Таким образом, должен быть явный «обратный маркер», чтобы компилятор знал, когда условие заканчивается. В C (++), Java, C # и других языках это () обозначает условие, в F # это ключевое слово 'then', а в других языках это перевод строки / отступ

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