int main() {
std::cout << 1, std::cout << 2;
return 0;
}
Приведенный выше фрагмент синтаксически верен, так как запятые могут использоваться для разделения утверждений. Однако,
int main() {
int a, std::string b;
return 0;
}
Это возвращается с ошибкой
Ожидаемый инициализатор перед 'b'
Почему это? Есть ли какие-то обстоятельства, при которых я не могу использовать запятую для разделения утверждений? Например в этом случае определение переменных?
Запятые никогда не разделяют предложения. Ваш первый пример — это один оператор, состоящий из выражения, содержащего оператор запятой . Это происходит так же, как если бы вы написали два утверждения std::cout << 1; std::cout << 2;
, но они не эквивалентны синтаксически.
Точно так же ваш второй пример (пытается быть) одним оператором объявления, и он не является синтаксически допустимым. Можно использовать запятую (не как оператор запятой) для разделения двух объявлений одного и того же типа int a, b;
с некоторыми вариациями, такими как int a, *b;
, но это все еще один оператор объявления.
std::cout << 1, std::cout << 2
— это выражение. Все, кроме точки с запятой.
И, возможно, одна из путаниц заключается в том, что std::cout << 1
и std::cout << 2
тоже являются выражениями. Это одна из причин, по которой вы можете связать дополнительные операции вывода с каждым. Выражения можно использовать как операторы, завершая их точкой с запятой, но не все операторы являются выражениями.
откуда я знаю, что std::cout << 1, std::cout << 2
это выражение?
а int a, string b
нет?
@LearningMathematics Просто так указаны правила языка.
@cigien, так указано ли, что cout
можно соединить запятыми, и все это по-прежнему будет выражением?
Если это так, то где я могу найти информацию?
@LearningMathematics: любые два выражения могут быть операндами оператора запятой. Смотрите ссылку, которую я дал выше, или fluentcpp.com/2018/07/31/… для более краткого ознакомления. Это общий факт о C++: бинарные операторы принимают два операнда, каждый из которых является выражением, а комбинация expression operator expression
сама по себе является выражением. Такое рекурсивное определение является фундаментальным для понимания синтаксиса языка программирования.
@LearningMathematics Существует ряд ресурсов, которыми вы можете воспользоваться. В общем, я бы рекомендовал использовать cppreference.com в качестве основного источника информации. Вы также можете найти официальные правила в стандартном тексте, но в основном это не нужно.
@LearningMathematics Сравните if (false) std::cout << 1; std::cout << 2;
с if (false) std::cout << 1, std::cout << 2;
Это покажет, насколько велика синтаксическая разница.
@LearningMathematics • Вы можете создать как a
, так и b
в одном выражении, выполнив auto [a, b] = std::make_tuple<int, std::string>(0, "");
.
Какой частью является выражение?