Вычисление констант в шестнадцатиричной форме. Баг?
От: SaZ  
Дата: 02.03.11 00:52
Оценка: 14 (4)
Данный код не компилируется:
void Foo( int var ) 
{ 
} 

int main( void ) 
{ 
  Foo( 0xE+1 );

  return 0; 
}

Проверка тут.

Это я чего-то не знаю про константы или это какая-то фича языка?
Re: Вычисление констант в шестнадцатиричной форме. Баг?
От: Слава Израиль  
Дата: 02.03.11 02:42
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Данный код не компилируется:

SaZ>
SaZ>void Foo( int var ) 
SaZ>{ 
SaZ>} 

SaZ>int main( void ) 
SaZ>{ 
SaZ>  Foo( 0xE+1 );

SaZ>  return 0; 
SaZ>}
SaZ>

SaZ>Проверка тут.

SaZ>Это я чего-то не знаю про константы или это какая-то фича языка?


Вставь пробел перед +,
проверка тут
Спасибо за внимание
Re: Сравни с 0e+1
От: Erop Россия  
Дата: 02.03.11 05:19
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Это я чего-то не знаю про константы или это какая-то фича языка?


Похоже их парсер не смог определиться, интегральный это тип, или FP...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Вычисление констант в шестнадцатиричной форме. Баг?
От: Erop Россия  
Дата: 02.03.11 05:20
Оценка:
Здравствуйте, Слава, Вы писали:

SaZ>>[ccode]

SaZ>> Foo( 0xE+1 );
С>Вставь пробел перед +,
С>проверка тут

А при чём тут пробел-то?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Вычисление констант в шестнадцатиричной форме. Баг?
От: Слава Израиль  
Дата: 02.03.11 05:25
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Слава, Вы писали:


SaZ>>>[ccode]

SaZ>>> Foo( 0xE+1 );
С>>Вставь пробел перед +,
С>>проверка тут

E>А при чём тут пробел-то?..


С пробелом скомпилировалось, мож кимпилятор всё, что стоит 0х считает шеснадцетиричной константой.
Спасибо за внимание
Re[4]: Вычисление констант в шестнадцатиричной форме. Баг?
От: K13 http://akvis.com
Дата: 02.03.11 05:36
Оценка: +1
С>>>Вставь пробел перед +,
С>>>проверка тут
E>>А при чём тут пробел-то?..
С>С пробелом скомпилировалось, мож кимпилятор всё, что стоит 0х считает шеснадцетиричной константой.

Выше уже сказали — компилятор подумал что похоже на плавучку: 1e+1
Re: Вычисление констант в шестнадцатиричной форме. Баг?
От: quodum  
Дата: 02.03.11 07:44
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Данный код не компилируется:

SaZ>
SaZ>  Foo( 0xE+1 );
SaZ>


SaZ>Это я чего-то не знаю про константы или это какая-то фича языка?


Похоже, что GCC увидел здесь User-defined literal. Согласно 2.14.8 (я смотрю драфт от 2010/11/27), суффикс должен удовлетворять ограничениям на идентификатор, чему "+1" явно не соответствует. Я думаю, можно заносить баг на GCC, чтобы вычеркнули плюсик из соответствующего места.
Re: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 02.03.11 12:46
Оценка: 3 (1)
Здравствуйте, SaZ, Вы писали:

SaZ>Данный код не компилируется:

SaZ>  Foo( 0xE+1 );

SaZ>Это я чего-то не знаю про константы или это какая-то фича языка?

На 3-ей фазе трансляции исходный файл разбивается на preprocessing tokens. При разбиении используется "жадный" алгоритм лексического разбора:

If the input stream has been parsed into preprocessing tokens up to a given character, the next preprocessing token is the longest sequence of characters that could constitute a preprocessing token, even if that would cause further lexical analysis to fail.


В грамматике preprocessing number определяется следующим образом:
pp-number:
           digit
           . digit
           pp-number digit
           pp-number nondigit
           pp-number e sign
           pp-number E sign
           pp-number .

Соответственно, 0xE+1 разбивается на два preprocessing tokens: 0xE+ и 1.

На 7-ой фазе трансляции каждый отдельный preprocessing token преобразуется в token:

Each preprocessing token that is converted to a token (2.6) shall have the lexical form of a keyword, an identifier, a literal, an operator, or a punctuator.


Ни к одному из валидных типов лексем (tokens) 0xE+ не принадлежит.
Re[2]: Вычисление констант в шестнадцатиричной форме. Баг?
От: B0FEE664  
Дата: 02.03.11 13:25
Оценка:
Здравствуйте, elcste, Вы писали:

E>В грамматике preprocessing number определяется следующим образом:
E>pp-number:
E>           digit
E>           . digit
E>           pp-number digit
E>           pp-number nondigit
E>           pp-number e sign
E>           pp-number E sign
E>           pp-number .
E>

E>Соответственно, 0xE+1 разбивается на два preprocessing tokens: 0xE+ и 1.

Разве x это digit ?
И каждый день — без права на ошибку...
Re[3]: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 02.03.11 13:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

E>>pp-number:
E>>           digit
E>>           . digit
E>>           pp-number digit
E>>           pp-number nondigit
E>>           pp-number e sign
E>>           pp-number E sign
E>>           pp-number .

E>>Соответственно, 0xE+1 разбивается на два preprocessing tokens: 0xE+ и 1.

BFE>Разве x это digit ?


Нет, x это nondigit.
Re[4]: Вычисление констант в шестнадцатиричной форме. Баг?
От: B0FEE664  
Дата: 02.03.11 14:14
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, B0FEE664, Вы писали:


E>
E>>>pp-number:
E>>>           digit
E>>>           . digit
E>>>           pp-number digit
E>>>           pp-number nondigit
E>>>           pp-number e sign
E>>>           pp-number E sign
E>>>           pp-number .

E>>>Соответственно, 0xE+1 разбивается на два preprocessing tokens: 0xE+ и 1.

BFE>>Разве x это digit ?


E>Нет, x это nondigit.


Я не понимаю вашего объяснения. 0xE+ это НЕ pp-number. Так?
И каждый день — без права на ошибку...
Re[5]: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 02.03.11 14:29
Оценка:
Здравствуйте, B0FEE664, Вы писали:

E>>>>pp-number:
E>>>>           digit
E>>>>           . digit
E>>>>           pp-number digit
E>>>>           pp-number nondigit
E>>>>           pp-number e sign
E>>>>           pp-number E sign
E>>>>           pp-number .

BFE>Я не понимаю вашего объяснения. 0xE+ это НЕ pp-number. Так?

Нет, не так. 0xE+ это pp-number, но это не literal.

             pp-number
      pp-number       E sign
pp-number nondigit
  digit

    0        x        E  +
Re[6]: Вычисление констант в шестнадцатиричной форме. Баг?
От: B0FEE664  
Дата: 02.03.11 14:48
Оценка:
Здравствуйте, elcste, Вы писали:

Видимо я не понимаю семантику этого правила:
E>
E>>>>>pp-number:
E>>>>>           digit
E>>>>>           . digit
E>>>>>           pp-number digit
E>>>>>           pp-number nondigit
E>>>>>           pp-number e sign
E>>>>>           pp-number E sign
E>>>>>           pp-number .


Скажем 0xE+x это pp-number ?

E>Нет, не так. 0xE+ это pp-number, но это не literal.

E>
E>             pp-number
E>      pp-number       E sign
E>pp-number nondigit
E>  digit

E>    0        x        E  +
E>


Т.е. nondigit может быть не последним ?
И каждый день — без права на ошибку...
Re[7]: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 02.03.11 15:07
Оценка: 1 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Видимо я не понимаю семантику этого правила:


Оно применяется рекурсивно: каждый pp-number в левой части, в свою очередь, раскрывается по этому же определению.

E>>>>>>pp-number:
E>>>>>>           digit
E>>>>>>           . digit
E>>>>>>           pp-number digit
E>>>>>>           pp-number nondigit
E>>>>>>           pp-number e sign
E>>>>>>           pp-number E sign
E>>>>>>           pp-number .

BFE>Скажем 0xE+x это pp-number ?

Да, т.к. 0xE+ это pp-number, а x это nondigit.

BFE>Т.е. nondigit может быть не последним ?


Да. Например: 0x01.
Re[7]: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 02.03.11 15:11
Оценка: +1
Здравствуйте, B0FEE664,

Да, кстати, я действительно был неправ. 0xE+1 это все один pp-number.
Re[2]: Вычисление констант в шестнадцатиричной форме. Баг?
От: Alexander G Украина  
Дата: 18.03.11 14:24
Оценка:
Здравствуйте, elcste, Вы писали:

E>...

E>В грамматике preprocessing number определяется следующим образом:
E>pp-number:
E>           digit
E>           . digit
E>           pp-number digit
E>           pp-number nondigit
E>           pp-number e sign
E>           pp-number E sign
E>           pp-number .
E>

E>Соответственно, 0xE+1 разбивается на два preprocessing tokens: 0xE+ и 1.
E>...
E>Ни к одному из валидных типов лексем (tokens) 0xE+ не принадлежит.

Логично, а почему тогда Foo( 1+1 ); компилируется?
Русский военный корабль идёт ко дну!
Re[3]: Вычисление констант в шестнадцатиричной форме. Баг?
От: elcste  
Дата: 18.03.11 15:47
Оценка:
Здравствуйте, Alexander G, Вы писали:

E>>В грамматике preprocessing number определяется следующим образом:
E>>pp-number:
E>>           digit
E>>           . digit
E>>           pp-number digit
E>>           pp-number nondigit
E>>           pp-number e sign
E>>           pp-number E sign
E>>           pp-number .
E>>


AG>Логично, а почему тогда Foo( 1+1 ); компилируется?


Потому что 1+1 не является pp-number, а 0xE+1 является?
Re[8]: Вычисление констант в шестнадцатиричной форме. Баг?
От: Шахтер Интернет  
Дата: 18.03.11 16:33
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, B0FEE664,


E>Да, кстати, я действительно был неправ. 0xE+1 это все один pp-number.


Я бы квалифицировал это как дефект языка.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: Вычисление констант в шестнадцатиричной форме. Баг?
От: Alexander G Украина  
Дата: 19.03.11 07:08
Оценка:
Здравствуйте, elcste, Вы писали:

E>Потому что 1+1 не является pp-number, а 0xE+1 является?


Ага, точно, теперь понял.
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.