2013-12-12 3 views
0

Я хочу знать, если это возможно, использовать возвращаемое значение заявления в C.Используя возвращаемое значение заявления

Например: Если я начну с a=0; то я знаю, что выражение a++ вернется 0, в то время как a+=1 вернется 1. Но говоря о высказываниях, есть ли какая-то смысловая разница между a++; и a+=1;?

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

+0

GCC имеет расширение под названием [Выражения выписки] (http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html), которое вы могли бы изучить, но это не стандарт. – Mat

ответ

7

заявления не имеют возвращаемого значения. Выражения имеют значения (за исключением типа void). Некоторые выражения также имеют побочные эффекты.

a++ имеет значение, равное исходное значение a и a+=1 имеет значение единиц больше, чем исходное значение a.

Присвоение нового значения a является побочным эффектом. Оба выражения имеют один и тот же побочный эффект.

В этом нет ничего сложнее. Однако обратите внимание, что в зависимости от побочного эффекта внутри одного и того же оператора (а не только одного и того же подвыражения) возникает неопределенное поведение, если нет точки последовательности. Множественные побочные эффекты в рамках одного и того же оператора и зависимостей побочных эффектов - это более продвинутая тема, поэтому лучше просто выполнять инструкции присваивания.

+0

Извините за то, что вы так запутываетесь. Я приведу еще один пример: main() {int a = 0; A ++; ... остальная часть кода} main() {int a = 0; а + = 1; ... остальная часть кода} Можно ли поместить что-нибудь в остальную часть кода, чтобы эти программы имели другое поведение? – user3094142

+1

@ user3094142 №. Выражения имеют точно такой же побочный эффект. – Potatoswatter

+0

@Potatoswatter: Так оно и есть. Атонные свойства C для меня тоже новы. –

1

Вы хотите сравнить ++a и (a+=1), которые возвращают 1

a++ средства вернуть старое значение, а затем изменить a

++a средство добавьте к a, и возвращает значение,

(a+=1) означает добавить один к a и вернуть новое значение (но технически это может быть медленнее)

На своей собственной линии, ++a, a++ и a+=1 все то же самое

если вы звоните: foo(a++) и foo(a+=1) Foo будут передаваться различные значения.

Технически ++a может быть быстрее, чем a+=1, но любой уровень оптимизации должно привести к одной и той же вещи

+0

Нет. Извините за то, что так запутано. Я приведу еще один пример: main() { int a = 0; a ++; ... остальная часть кода } main() { int a = 0; a + = 1; ... остальная часть кода } Можно ли положить что-нибудь в остальной части кода, чтобы эти программы отличались поведением? – user3094142

+0

Почему '++ a' должен быть быстрее, чем' a + = 1'?Если вы думаете о некоторых процессорах с инструкцией 'inc',« быстрее », чем« добавить 1 », где по крайней мере нужно получить дополнительное мгновенное значение из mem (1 ... хотя cpus, например 680x0, может иметь некоторый другой вид «оптимизации» в зависимости от добавленного значения val, а не от того, как вы выражаете его в C), ... но не все cpus имеют эту инструкцию. – ShinTakezou

+0

@ShinTakezou сократил утверждение до «может быть», и да, это то, что я имел в виду. Но, как упоминалось, любой уровень оптимизации будет использовать одно и то же лучшее выражение для обоих –

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