2011-01-13 12 views
3

Я читаю Программирование Бьярне Страуструпа: Принципы и практика Использование C++Нужно ли заканчивать cout точкой с запятой?

В разделе бура для главы 2 он говорит о различных способах, чтобы смотреть на опечаток при составлении программы

#include "std_lib_facilities.h" 

int main() //C++ programs start by executing the function main 
{ 
    cout << "Hello, World!\n", // output "Hello, World!" 
    keep_window_open();   // wait for a character to be entered 
    return 0; 
} 

hello_world В частности, это раздел спрашивает:

Придумайте еще по крайней мере пять ошибок, которые вы могли бы сделать, набрав в вашей программы (например, забыть keep_window_open(), оставьте колпачков клавишу блокировки на время набора слова или запятую вместо точки с запятой) и попробовать все, чтобы увидеть, что происходит, когда вы пытаетесь скомпилировать и запустить эти версии.

Для линии cout вы можете видеть, что вместо точки с запятой есть запятая.
Это компилируется и запускается (для меня). Делает ли это предположение (например, в вопросе javascript: Why use semicolon?), что утверждение было прервано?

Потому что, когда я пытаюсь использовать keep_terminal_open();, компилятор информирует меня об исключении точки с запятой.

ответ

11

Оператор запятой в C++ можно использовать следующим образом: «делать a, игнорировать результат, то сделать b»

a, b; 

Это означает, Вы можете связать это следующим образом:

a, b, c, (etc.), n; 

В целом, это не считается хорошим стилем. Оператор запятой редко используется на практике, потому что он запутан. Несколько раз это законно полезно обычно придумать для петель:

for (int a = 0, b = 0; a < 100; a++, b++) { 
    /* ... */ 
} 

Здесь мы используем оператор запятой в последней части для цикла означает «приращение как a и b

Чтобы ответить на ваш вопрос, да, у вас должна быть точка с запятой после cout. Технически работает также оператор запятой, но он неэффективен и, вероятно, путает людей.

+1

Ваш пример цикла 'for' не используется в качестве оператора запятой, это просто часть синтаксиса для объявления переменной. –

+3

@ Chris Lutz. Первая часть цикла - это объявление переменной, но последняя часть (a ++, b ++) действительно используется оператором запятой. Я заметил это только после того, как вы это указали. :-) – templatetypedef

+0

@templatetypedef - Справа! Я должен работать над моим рефлексием с ошибкой и комментариями. –

1

оно должно быть прекращено с одним, да

+0

Не обязательно. См. Мой ответ. –

+0

Итак, сначала вы стучите, как я сказал 'должен', а затем использовал его самостоятельно. – tekknolagi

+0

@tekknolagi: А? –

3

Любое заявление должно быть прекращено с запятой:

std::cout << "Hi world"; 

Однако, помимо всего прочего, выражение может принимать форму A,B,C, где A и B и C оцениваются, а затем C становится результатом.

Если вы поместите следующее выражение:

std::cout << "Hi world", 3 

в заявлении:

std::cout << "Hi world", 3; 

, то это выглядит, как вы не нужна точка с запятой в конце заявления. На самом деле произошло то, что вы неправильно поняли, что такое «заявление».

Надеюсь, это помогло.

+0

Да, вы правы. Я сел и посмотрел и попробовал другие сочетания операторов с/без точек с запятой, заканчивающими утверждение, предшествующее возврату ... Не могли бы вы объяснить возвращение? Я думал, что это заявление, http://msdn.microsoft.com/en-us/library/k68ktdwf(v=vs.80).aspx или его нельзя использовать с оператором запятой? – phwd

+0

@PhilippeHarewood: Извините, но я не понимаю ваш вопрос. 'return X;' действительно является выражением; Я не вижу, что это связано с этим, поскольку ваша запятая была в предыдущем утверждении. Ваш оператор 'return' остается неизменным. –

+0

Ничего страшного, я понял это, я ценю объяснение :) – phwd

0

Просто, чтобы объяснить некоторые другие аспекты ситуации ...

Оператор запятая имеет самый низкий приоритет операторов любого C++, так что - например - код ...

#include <iostream> 

int main() 
{ 
    std::cout << 5, 2; // outputs 5, complete line/statement evaluates to 2 
    std::cout << '\n'; 
    std::cout << (5, 2); // outputs 2 (5 is discarded), line evaluates to std::cout 
    std::cout << '\n'; 
} 

... будет выводить «5» в строке с комментарием а, и «2» из В.

из-за этого приоритета, заметим, что если keep_window_open() вернулся void, затем std::cout Wou ldn't знают, как поток его, и вы получите ошибку компиляции из ...

std::cout << keep_window_open(); // can't compile if function return type is void 

... но до сих пор не было бы безопасно в использовании вы исследуете ...

std::cout << "Hello, World!\n", // can compile because seen as two comma-separated 
keep_window_open();    // subexpressions, so std::cout doesn't try to stream 
           // a return value from keep_window_open(). 
Смежные вопросы