Вопрос:

«Обратно» Условные выражения в Си

c conditional

130 просмотра

4 ответа

59 Репутация автора

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

if (NULL != buf) {...}

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

if(buf != NULL){...}

Я не вижу причин делать это первым делом, но я не думаю, что это было ошибкой. Мне кажется, что они выполняют одно и то же, но второй способ более интуитивен. Есть ли какая-то конкретная причина использовать первое условное выражение?

Автор: Justin Wang Источник Размещён: 30.06.2015 04:34

Ответы (4)


4 плюса

20246 Репутация автора

Это, чтобы избежать опечатки новичка, как if (buf = NULL).

if (NULL = buf)приводит к ошибке компиляции, в то время if (buf = NULL)как полностью корректно с нежелательной семантикой.

Автор: timrau Размещён: 30.06.2015 04:35

7 плюса

1718 Репутация автора

Решение

Да, это называется " Йода условия ". Идея состоит в том, чтобы случайно не присвоить значение, когда вы хотите выполнить проверку. Большинство современных компиляторов должны это уловить.

Автор: rost0031 Размещён: 30.06.2015 04:36

3 плюса

3507 Репутация автора

Концепция в основном такова:

Часто новые ученики пропускают двойной знак равенства ==и =вместо этого используют один . Поэтому инструкторы учат их этому методу, чтобы они не застревали в простых программах.

Если не включены предупреждения компилятора, если вы сделаете это:

if(buf = NULL)

Вы в основном назначаете NULL buf, что не является синтаксически неправильным, и вы не получите никаких предупреждений, но когда вы сделаете это:

if(NULL = buf)

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

Почему именно Йода?

Это из-за персонажа Йоды из «Звездных войн», чьи диалоги были оформлены в обратном порядке, например «Голубое небо».

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

Автор: Ayushi Jha Размещён: 30.06.2015 04:41

2 плюса

8557 Репутация автора

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

Например, если вы компилируете

if (buf = NULL) {}

компилятор говорит,

предупреждение: предложить круглые скобки вокруг присваивания, используемого в качестве значения истины [-Wparentheses]

но если вы измените его на

if (NULL = buf) {}

теперь компилятор говорит:

ошибка: lvalue требуется как левый операнд присваивания

Автор: Shreevardhan Размещён: 30.06.2015 04:41
Вопросы из категории :
32x32