2012-02-09 2 views
1

Это int c = (a==b) - это именно то, что я хотел бы сказать в моей программе на C, с компиляцией с GCC. Я могу это сделать, очевидно (это работает отлично), но я не знаю, может ли это вызвать неопределенное поведение. Моя программа не будет скомпилирована с каким-либо другим компилятором или в других архитектурах. Является ли это законным ANSI C? Благодарю.Оценка с правой стороны задания

+4

Что не определено об этом? o_O – kennytm

+0

Какой компилятор не принимает его? – cnicutar

+0

Итак, вы имеете в виду ответ «да, это законно»? Зачем вам отвечать на другой вопрос? –

ответ

4

Это совершенно законно. если a равно b, то c будет 1. иначе, это будет 0.

+0

Если 'a' равно' b', то 'c' может быть чем угодно отличным от нуля, не так ли? –

+3

@Teh: Нет, это должно быть 1. (C99 §6.5.9/3 так говорит.) – kennytm

+0

Я не уверен, но я думаю, что это должно быть 1. (любое ненулевое число означает true, но сравнение операторов return only 0 or 1) Edit: Я написал это перед просмотром комментария KennyTM. – asaelr

1
int c = (a == b); 

это совершенно законно. Инициализация является частью стандарта C (C99 §6.7.8), правая сторона может быть любой присваивание-выражение, включая a == b (конечно, при условии, что a и b определены и имеют сопоставимый тип).

+0

спасибо. Именно этот ответ мне нужен. –

0

Ну, это зависит от того, какие типы a и b есть. Если они являются типами, которые поддерживают проверку равенства, то да, это совершенно законно.

1

Это совершенно верно, если c объявлен в области объема.

При объявлении в области видимости файла оно недействительно, поскольку инициализатор должен быть постоянным выражением.

a == b - выражение и в этом смысле не отличается от другого выражения, например, a + b или a & b.

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