2012-04-30 4 views
3

Я запускаю фрагмент кода. Но я не могу понять код и выходные данные, которые он производит.Не могу понять причину вывода

#include <stdio.h> 
int main() 
{ 
    int a, b,c, d;  
    a=3;  
    b=5;  
    c=a,b;  
    d=(a,b);  
    printf("c = %d" ,c);  
    printf("\nd = %d" ,d);  
    return 0; 
} 

Вывод этой программы:

c=3 
d=5 

я не получаю, как выход идет?

ответ

3

Учитывайте приоритет оператора запятой C.

9
  1. Если у вас есть запятая, выражение оценивается как правильный параметр, поэтому d=(a,b); оценивается как d=b.
  2. = имеет higher precedence над запятой, поэтому выражение c=a,b; оценивается как (c=a),b;

не часть ответа, но стоит отметить, что в целом c=a,b; выражение, оценивается как b, не, например, если вы напишете d=(c=a,b);, вы получите c=a AND d=b;

1

Позаботьтесь о том, чтобы оператор запятой был перегружен на C++. Фактическое поведение может, таким образом, сильно отличаться от ожидаемого.

В качестве примера Boost.Spirit использует оператор запятой довольно умно, чтобы реализовать инициализаторы списка для таблиц символов. Таким образом, он делает следующий синтаксис возможно и целесообразно: (! Намеренно)

keywords = "and", "or", "not", "xor"; 

Обратите внимание, что из-за приоритета операторов, код идентичен

(((keywords = "and"), "or"), "not"), "xor"; 

То есть, первый оператор называется это ключевые слова .оператор = ("и"), который возвращает объект-посредник, на который вызывается оставшийся оператор, s:

keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor"); 
Смежные вопросы