Ошибка: ожидаемое выражение перед int внутри, если условие [duplicate]

В Android, сетевые операции не могут выполняться в основном потоке. Для выполнения сетевых операций вы можете использовать Thread, AsyncTask (краткосрочные задачи), Service (длительные задачи).

26
задан Richard 15 March 2014 в 07:09
поделиться

3 ответа

На самом деле это довольно интересный вопрос. Это не так просто, как кажется на первый взгляд. Для справки я буду основывать это на последней грамматике языка 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
46
ответ дан Nisse Engström 27 August 2018 в 04:38
поделиться

{ } ->

определяет область действия, поэтому if(a==1) { int b = 10; } говорит, что вы определяете int b, для {} - этой области. Для

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

нет области действия. И вы не сможете использовать b в любом месте.

1
ответ дан Pranit Kothari 27 August 2018 в 04:38
поделиться

В C89 переменная может быть определена только в верхней части блока.

if (a == 1)
    int b = 10;   // it's just a statement, syntacitially error 

if (a == 1)
{                  // refer to the beginning of a local block 
    int b = 10;    // at the top of the local block, syntacitially correct
}                  // refer to the end of a local block

if (a == 1)
{
    func();
    int b = 10;    // not at the top of the local block, syntacitially error, I guess
}
-2
ответ дан user3422531 27 August 2018 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: