2014-10-07 2 views
6
#include <stdio.h> 

int main(void) 
{ 
    int a = 1, i = 3, x, y, z; 
    a = 1; i = 3; 
    x = a+++i; 
    a = 1; i = 3; 
    y = a++ + i; 
    a = 1; i = 3; 
    z = a + ++i; 
    printf("%d %d %d", x, y, z); 
    scanf(" "); 
    return 0; 
}  

Этот вывод кода выглядит 4 4 5. Но почему a+++i равно a++ + i?Является ли «a +++ i» равным «(a ++) + i» в C

Это потому, что компиляторы всегда читают исходный код слева направо?

Или это потому, что операция следует за the order of precedence?

И будет ли он работать на всех компиляторах?

+0

Относится к [Почему не работает +++++ b в C?] (Http://stackoverflow.com/q/5341202/1708801) –

ответ

5

стандарта C11, часть 6.4 (Lexical elements)/4 говорит (и в C99 это то же самое):

Если входной поток был проанализирован в предварительную обработку лексемы до данного символа, следующая лексема предварительной обработки является самой длинной последовательностью символов, которые могут составлять токен предварительной обработки .

Существует также пример есть:

Программа фрагмент x+++++y анализируется как x ++ ++ + y, что нарушает ограничение на операторов приращения, даже несмотря на то синтаксический анализ x ++ + ++ y может дать правильное выражение.

1

Я не могу сказать все, так как реализация компилятора C может отличаться. Но в целом да, вы правы. Компилятор C должен быть жадным, то есть читать как можно больше, поэтому +++ == ++ +.

+0

Не найдены ли шаблоны на C++? –

+0

Ах, вы правы! – Vin

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