2009-11-11 3 views
2

может кто-нибудь пожалуйста, скажите мне разницу между следующими двумя фрагментами кода:Ill формируется фрагменты кода

//Code snippet A: Compiles fine 
int main() 
{ 
    if(int i = 2) 
    { 
     i = 2 + 3; 
    } 
    else 
    { 
     i = 0; 
    } 
} 

//Code Snippet B: Doesn't compile :(
int main() 
{ 
    if((int i = 2)) 
    { 
     i = 2 + 3; 
    } 
    else 
    { 
     i = 0; 
    } 
} 

Если вы заметили, что разница только дополнительные скобки в если заявление. Я использую g ++ compiler.Error является «ожидаемым основным выражением перед âintâ»

+0

Зачем вам это нужно? Ни один код не имеет большого смысла. –

+2

duplicate: http: // stackoverflow.com/questions/1516919/declaring-and-initializing-a-variable-in-a-condition-or-control-statement-in-c – AraK

+0

просто пытается понять C++ Грэм. –

ответ

18

Раздел 6.4 стандарта С ++ (проект n2914 из C++ 0x) это сказать о формате if заявления:

Selection statements choose one of several flows of control.
    selection-statement:
       if (condition) statement
       if (condition) statement else statement
       switch (condition) statement
    condition:
       expression
       type-specifier-seq attribute-specifieropt declarator = initializer-clause
       type-specifier-seq attribute-specifieropt declarator braced-init-list

Это немного в конце означает, что условие может быть либо выражением или Конструкция типа декалятора.

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

Фрагмент:

if (int i = 2) { ... } else { ... } 

вполне допустимо С ++, в котором, если секция определяет целое число i для продолжительности if/else и устанавливает его на 2. Затем оно использует 2 в качестве входных данных для if (2 всегда истинно, отличное от нуля).

Фрагмент if((int i = 2)) не отличается синтаксически с int x = (int i = 2;); if (x) который не действительный C++.

+0

Мне нравится ваш ответ, а также помощник :) Вы, безусловно, делаете здесь хорошую работу. –

1

Оба выглядят неправильно.

Просто потому, что код компилируется, это не значит, что он действителен. Я удивлен, что первый случай компилируется, так как i не определен в случае else.

Редактировать: Я ошибаюсь здесь, определения в состоянии if действительны для этого целого if/else заявление.

+4

Объем декларатора int до конца инструкции * whole * if. – paxdiablo

+1

Не только это, но выражение внутри if выполняет присваивание, а не сравнение, и, как таковое, случай else никогда не будет достигнут. –

+0

Первый случай - вполне допустимый C++. Это не должно быть полезно. 'if (0)' также отлично действует C++, несмотря на то, что это бесполезно. – paxdiablo

5

Вот еще один вариант второй ошибки сниппета:

int main() 
{ 
    int i = (int j = 0); 
    return 0; 
} 

Вы не можете объявлять переменные внутри любого выражения. Второй() внутри для одного и того же случая - вы можете объявить переменную i внутри for(), но не внутри вложенного выражения, помещенного в().

Надеюсь, я объяснил это правильными словами, возможно, правильное объяснение существует. На самом деле оба фрагмента кода являются нечетными.

10

Фрагмент A в порядке - условие if задает и инициализирует переменную, которая может быть интерпретирована как логическая. Переменная определена в пределах if и любых блоков else.

Фрагмент B неверен, потому что вы не можете вставлять круглые скобки вокруг объявления - вы можете только поставить их круглыми выражениями. По этой же причине неверны также:

int main() 
{ 
    int i;  // OK 
    (i = 2);  // OK 

    (int x = 2); // compile error 
} 
+0

Спасибо, Майк! простой и лучший ответ :) ..wish я мог проголосовать .. еще не зарегистрирован. –

+0

Ну, зарегистрируйтесь, чтобы вы могли. Хотя я не могу согласиться, что это лучший ответ, это, безусловно, очень лаконично, особенно для тех, кто здесь не желает сидеть в моих обычных эссе, чтобы найти драгоценный камень хорошей информации :-) Я уже поддержал его. – paxdiablo

+0

upvoting - это поощрять ... правду? .. и все-таки филантроп :) –

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