Что означает кусок этого кода?
От: the_moon  
Дата: 17.08.10 08:51
Оценка:
вернее, что это могло бы значить? Наткнулся на него, потому, что компайлер на вторую строку выдал дважды предупреждение

warning #2174-D: expression has no effect

    if ((ind_order_text == 0) &&
            (strncmp,"                                   ",
             strlen(order_text))
         )


Почему оно все равно компилируется?

Спасибо
KOPOTbILLIKA KPbIC
Re: Что означает кусок этого кода?
От: OdesitVadim Украина  
Дата: 17.08.10 09:04
Оценка:
Здравствуйте, the_moon, Вы писали:

_>Почему оно все равно компилируется?


_>Спасибо

Смотрим на это

(strncmp,"                                   ",
             strlen(order_text))

но записаное так

(strncmp," [scip] ", strlen(order_text))

так как после имени функии стоит запятая, а не скобка, то это не вызов функции, а оператор запятая. То есть имеем три выражения. первое возвращает адрес функции, а не вызывает ее. Второе просто строка, но тоже валидное себе выражение. С третим выражением вопросов нет.
Результатом операции запятая будет результат самого правого выражения.
Вот поэтому компилятор и говорит дважды, что результат вычислений не используется — он действительно не используется
Re: Что означает кусок этого кода?
От: Chorkov Россия  
Дата: 17.08.10 09:05
Оценка: +1
Здравствуйте, the_moon, Вы писали:

_>вернее, что это могло бы значить? Наткнулся на него, потому, что компайлер на вторую строку выдал дважды предупреждение


_>warning #2174-D: expression has no effect


Рассмотрим вырадение:
_>
_>            (strncmp,"                                   ",
_>             strlen(order_text))
_>


_>Почему оно все равно компилируется?



Здесь использован оператор запятая.

5.18 Comma operator [expr.comma]
1 The comma operator groups left-to-right.

 expression:
  assignment-expression
  expression , assignment-expression

A pair of expressions separated by a comma is evaluated left-to-right and the value of the left expression is discarded.
The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are not applied to
the left expression. Every value computation and side effect associated with the left expression is sequenced before
every value computation and side effect associated with the right expression. The type and value of the result are the
type and value of the right operand; the result is an lvalue if its right operand is an lvalue, and is a bit-field if its right
operand is an lvalue and a bit-field.
2 In contexts where comma is given a special meaning, [ Example: in lists of arguments to functions (5.2.2) and lists
of initializers (8.5) —end example ] the comma operator as described in clause 5 can appear only in parentheses.
[ Example:
f(a, (t=3, t+2), c);

has three arguments, the second of which has the value 5. —end example ]



Первое подвыражение
 strncmp
(хотя и нет оператора взятия адреса) возвращает адрес функции (ради совметимости с С).

Второе :
 "                                   "
— константное выражение. Никакого кода для его вычисления, тоже, сгенерировано не будет.

Третье:
 strlen(order_text)
— Собственно и будет вычислен.

т.е. Выражение эквивалентно:
    if ((ind_order_text == 0) && strlen(order_text) )


(Это все о том как данный текст понял компилятор. Что хотел сказать автор кода — великая тайна.)
Re[2]: Что означает кусок этого кода?
От: the_moon  
Дата: 17.08.10 09:12
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

спасибо, не знал, что запятая это оператор
KOPOTbILLIKA KPbIC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.