2016-05-03 5 views
0

У меня на экзамене в университете на следующей неделе, и я смотрел на старые экзаменационные документы, один из вопросов дает этот фрагментированный бит кода.Не могу понять это, если заявление

int a=2, b=-1, c=0; 

    if (a-2||b&&c||a){ 

    printf("True\n"); 

    } else { 

    printf("False\n"); 

    } 

Мы должны определить, что выход из этого кода будет, но если оператор не имеет смысла для меня любой, если заявление я наткнулся было очень специфична, как говорят

if(x == 0) 

I не знаю, что это значит, мое единственное предположение заключается в том, что это будет всегда верно. Я прав, или есть еще что-то для этого тогда?

+7

Обратите внимание, что ваш последний пример ('if (x = 0)') является присваиванием, а тело оператора if никогда не будет выполнено. Возможно, вы имели в виду 'if (x == 0)'. –

+2

Проверьте документацию о приоритете операторов '' '' '(http://en.cppreference.com/w/c/language/operator_precedence).Он также ссылается на страницы описания каждого типа операторов 'C'. – axiac

+1

Оператор if содержит выражение, и вам необходимо оценить его, принимая во внимание приоритет оператора. Если он оценивает значение 0, это неверно, иначе это правда. – JeffRSon

ответ

12

Это задание преследует две цели:

  • , чтобы показать, что булевы находятся в C: По существу они оценивают в Интс с ложным отображением 0 и истинного отображения 1. В свою очередь, любое числовое или указатель значение может быть используется в целочисленном контексте с соответствующим нулевым значением (0, 0.0, NULL (указатель), 0.0f, 0L и т. д.), оценивая как false, а все остальные - как истинные.
  • показать приоритет операторов

&& имеет более высокий приоритет, чем ||, так что это утверждение эквивалентно

a-2 || (b&&c) || a 

которая будет оценивать в true, если любое из значений верно.

В качестве a==2, a-2 является 0. c равно 0, поэтому b && c равно 0.

Таким образом, мы имеем 0 || 0 || a, что верно, как a равно 2.

+0

'0.0' и' 0.0f' также оцениваются как false. – EOF

+1

* Любой тип *, имеющий нулевое значение, имеет значение false, даже указатель. Строго, хотя C99 вводил логические типы как определенный тип. – cdarke

+0

Вы оба правы, но я хотел показать противоположное направление. Но теперь я отредактировал свой ответ, чтобы показать оба направления. – glglgl

1

Вы должны понимать, что истина и ложь в C всегда числовые.

https://www.le.ac.uk/users/rjm1/cotter/page_37.htm

А именно, все, что имеет значение числового нуля является ложным, и все, что имеет значение числовые ненулевой верно.

0
int a=2, b=-1, c=0; 

int first=a-2; //0 -> false 
bool second= b&& c; // nonZero&&zero -> true&&false -> false 
int third = 2; // nonZero -> true 

// false|| false|| true -> true 
    if (first || second || third){ 

    printf("True\n"); 

    } else { 

    printf("False\n"); 

    } 
2

Большинство языков интерпретирует ненулевые целые числа, как истинный и ноль как ложные, так что здесь вы должны рассчитать каждый из терминов. Без каких-либо скобок я бы предположил, что the && statement is taken in account first. Итак, мы имеем:

if (2-2 // gives zero 
|| // OR 
-1 && 0 // -1 AND 0 gives false 
|| // OR 
a) // Which is 2, which is true 

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

Если predecence был другой путь вокруг (||> & &), вы должны понимать, что это было бы ложные вместо этого. Я думаю, что весь этот пример здесь.

(a-2 || b) && (c || a) 
false && true 
--> false 
1

В с языком целых чисел от 0 трактуются как ложного и любого ненулевого целого значение является истинным, но следует отметить, что с языком и SME заявления будет показывать ошибку компиляции в java как java является более строгим, а целые числа не преобразуются в booleans.

Говоря о вышеуказанных проблемах присваивания выражения внутри, если оператор будет вычисляться, как true (a-2||b&&c||a) такого же, как (2-2||-1&&0||2) который является таким же, как (0||0||2), который оценивается как (false||false||true) и, следовательно, все выражение принимает значение true. надеюсь, что это поможет.

0

вам нужно понять две вещи, прежде чем решить эту проблему, которая является оператор старшинства и ассоциативность операторов

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

int a=2, b=-1, c=0; 

    if (a-2||b&&c||a){ 

вы можете думать, как

if((a-2)||(b&&c)||a){} 
means - has top precedence so it will solved first 
reduced to if(0||(b&&c)||a){} 
then && has higher precedence so 
reduced to if(0||false||a) 
then the associativity is left to right so 
reduced to if(false||a) 
that is(false||2) 
return true 
-1

Почти в каждом языке программирования, насколько я знать 0 означает false, а 1 означает true.

Так что, дойдя до вашего вопроса, вы использовали && и || операторов. Оба они называются логическими операторами. Теперь ваш первый блок - a-2||b :- 2-2||-1, поэтому 0||-1. Теперь, поскольку правильное выражение || равно -1, оператор or вернется 1, то есть True, потому что одно из значений 0 и -1 отличное от нуля 0, т.е. -1.

Поэтому выражение решает 1&&c||a: -

Теперь c=0, поэтому 1&&0 возвращает 0, потому что && будет возвращать только 1, если оба выражения справа и слева от него являются не равен нулю. Так выражение становится 0||2: -

Теперь, так как || (или оператор) требует только один из операндов либо на правой или левой стороне, чтобы быть не равен нулю, следовательно, 0 || 2 возвращает 1.

Теперь ваши if (a-2||b&&c||a) заявление ПОСТАНОВЛЯЕТ до

if (1) 
{ 

    printf("True\n"); } 
else...... 

Поэтому, поскольку 1 означает TRUE, оператор if будет выполняться, и вы получите выход как True.

+0

Вы ошибаетесь в своем первом предложении: на Java, e. g., вы должны явно сравнить с 0, чтобы получить логическое выражение. – glglgl

+0

Вот почему я сказал почти каждый язык программирования, который включает c, C++ и исключает java и т. Д., И есть большая разница между почти каждым, и я надеюсь, что у меня получится. –

Смежные вопросы