Member 13015247 Ответов: 2

Проблема с возвращаемым значением?


здесь я удивлен выводом, который он всегда дает 1 Может ли кто-нибудь объяснить, что return делает здесь и как и что он возвращает ?

Что я уже пробовал:

#include<stdio.h>
int main()
{
int a=5,b;
b=fun(a);
printf("%d",b);
}
int fun(int a)
{
    return a--&&a++;
}

[no name]

Где же "проблема возвращаемого значения"? Это ты написал. Что он должен делать?

Richard MacCutchan

Вы начинаете с a=5, а затем выражение в вашем операторе return фактически утверждает return (somevalue && someothervalue), и поскольку оба они ненулевые, вы получаете значение 1, которое представляет логическое значение TRUE.

Ничего удивительного, кроме удивления, что кто-то мог написать такое выражение.

2 Ответов

Рейтинг:
1

Patrice T

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

В вашем случае вас волнует только это a отличается от нуля. В C для любой переменной, 0 is false и non zero is true.
Итак, ваш код означает true and true и в результате 1 потому что это значит true.


Рейтинг:
0

OriginalGriff

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

Таким образом, вы не можете сказать, когда выполняются приращения post: это может быть:

x = a;
a += 1;
a -= 1;
return x && x;
Или
x = a;
a += 1;
y = a;
a -= 1;
return x && y;
Или какая-то другая комбинация.
В данном случае это, вероятно, второй вариант - но это не обязательно, и это плохая идея "играть" с этими вещами, так как результат может отличаться в зависимости от используемого компилятора или даже оптимизации между отладочной сборкой и сборкой выпуска!
Держите операции до и после модификации простыми: усложнение их делает код трудным для чтения, трудным для понимания и ненадежным!


[no name]

Однако в этом случае до после или что-то еще не влияет на результат. Так в чем же собственно вопрос?

OriginalGriff

"Почему что-то, чего я не понимаю, происходит, когда я делаю что-то, что не полностью определено?"
:смеяться: