2013-08-07 2 views
-1

У меня нет компилятора, чтобы проверить это сам.C99 однострочный синтаксис синтаксиса строки

  1. Является ли код в Версии 1 (ниже) действительным в C C99? Будет ли он компилироваться и работать нормально?
  2. Является ли он логически эквивалентным коду в версии 2?

Версия 1:

int a, b, c, d; 

... some code to set the above variables ... 

if (a != b != c != d) 
    //Do something 

... rest of code ... 

Версия 2:

int a, b, c, d; 

... some code to set the above variables ... 

if ((a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d)) 
    //Do something 

... rest of code ... 
+3

Если вы в сети, есть несколько [онлайн-компиляторов] (http://stackoverflow.com/questions/3916000/online-c-compiler-and-evaluator) и по крайней мере с Coliru и ideone, это прямо используйте C99. –

ответ

3

С != связан слева направо:

if (a != b != c != d) 

могут быть переведены на

if (((a != b) != c) != d) 

Но результат не то, что вы ожидали, например, при a = 100, b = 200;, то a != b является 0, потому что любое истинное значение оценивается как 1, ложное значение как 0. Так что на ваш вопрос:

Является ли код в Версии 1 (ниже) действительным в C C99? Будет ли он компилироваться и работать нормально? Является ли он логически эквивалентным коду в версии 2?

Это действительно, но это не соответствует коду в версии 2.

2

Первая программа действует код C.

Это не эквивалентно второй программе, так как в результате действия оператора != либо 0, либо 1.

1

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

if (((a != b) != c) != d) 

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

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