Почему код "x ++ && y ++;"работать в Си без оператора управления? - PullRequest
0 голосов
/ 28 октября 2018

Я искал способы сократить использование моей линии и столкнулся с этим, и, кажется, работает нормально.Я не могу найти какую-либо информацию в Интернете, кто-то может объяснить, что происходит?Предполагая, что он даже запустится, я по-прежнему ожидаю, что x ++ будет иметь значение false, и, следовательно, значение y не увеличится.Но это так!

#include <stdio.h>

int     main(void)
{
    int     x;
    int     y;

    x = 4;
    y = 7;
    x++ && y++;
    printf("%d\n%d", x, y);
    return (0);
}
>> 5 
   8

Редактировать: у меня есть ограничение на функцию в 25 строк на функцию для моего проекта, поэтому я должен сократить несколько строк.

Редактировать 2: весь мой код подвергается строгой проверке синтаксиса и формата, проверка запрещает "x ++, y ++;"и любой другой многострочный оператор, так что я просто искал «хак», чтобы отрезать одну строку из моей программы, и понятия не имел, почему ^^ работает для меня!Спасибо за все ответы!

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Дух из 25 строк на правило функции действительно для масштабируемости и ясности;Вы должны стремиться соответствовать ей, разбивая длинную функцию на отдельные функции компонента, а не пытаться сыграть в гольф свой код с помощью таких ухищрений, которые вы приводите в своем вопросе.

С помощью выраженияx++ && y++, y++ оценивается только в том случае, если x++ не равен нулю, и обратите внимание, что x++ соответствует начальному значению x.

Обратите внимание, что вы можете уменьшить вашу программу до

#include <stdio.h>
int main()
{
     for (int x = 4, y = 7; x++ && y++, printf("%d\n%d", x, y); ) break;
}

что приятно, так как у вас осталось 24 строки !?Обратите внимание, что компилятор требуется для вставки неявного return 0; в случае функции main.

0 голосов
/ 28 октября 2018

Логические операторы && и || используют оценка короткого замыкания .

Для обеих левой стороны всегда оценено.Для &&, если левая сторона имеет значение «истина», то правая сторона также оценивается.Для || все наоборот, если левая часть имеет значение «ложь», то вычисляется правая часть.

А в C все ненулевое значение равно «истина».Только ноль - «ложь».

...