Java: поток при событии через каждый определенный промежуток времени (наблюдатель проблем внутри потока: метод EventSource.run () выполняется в бесконечном цикле)

На самом деле это довольно интересный вопрос. Это не так просто, как кажется на первый взгляд. Для справки я буду основывать это на последней грамматике языка C11, определенной в N1570

Я предполагаю, что встречная интуитивная часть вопроса: если это верный C:

if (a == 1) {
  int b = 10;
}

, то почему это не так правильно? C [

if (a == 1)
  int b = 10;

Я имею в виду, что однострочный условный if оператор должен быть точным либо с помощью или без фигурных скобок, справа?

Ответ лежит в грамматике оператора if, как это определено стандартом C. Соответствующие части грамматики, приведенные ниже. Вкратце: строка int b = 10 является объявлением , а не оператором , а для грамматики для оператора if требуется утверждение после условного тестирования. Но если вы вложите объявление в фигурные скобки, оно станет утверждением, и все будет хорошо.

И только для того, чтобы полностью ответить на вопрос - это не имеет никакого отношения к сфере видимости. Переменная b, которая существует внутри этой области, будет недоступна извне, но программа по-прежнему синтаксически корректна. Строго говоря, компилятор не должен выставлять на него ошибку. Конечно, вы должны строить с -Wall -Werror в любом случае; -)

(6.7) declaration:
            declaration-specifiers init-declarator-listopt;
            static_assert-declaration

(6.7) init-declarator-list:
            init-declarator
            init-declarator-list , init-declarator

(6.7) init-declarator:
            declarator
            declarator = initializer

(6.8) statement:
            labeled-statement
            compound-statement
            expression-statement
            selection-statement
            iteration-statement
            jump-statement

(6.8.2) compound-statement:
            { block-item-listopt}

(6.8.4) selection-statement:
            if ( expression ) statement
            if ( expression ) statement else statement
            switch ( expression ) statement

0
задан fred2040 24 February 2015 в 23:42
поделиться