Ваша непосредственная проблема заключается в том, что вы используете =
(назначение), а в ==
(равенство):
if(ch=='.' || ch=='"' || ch=='(' || ch=')' || ...
___^____
see here
То, что происходит это делать с относительным приоритетом различных битов. Хотя ==
будет связываться на более высоком уровне, чем ||
, a == b || c == d
оценивается как (a == b) || (c == d)
.
Однако =
не связывается на более высоком уровне, поэтому a == b || c = d
оценивает как ((a == b) || c) = d)
. С вашего кода, который заканчивается с частью выражения:
('(' || ch) = ')'
Другими словами, вы пытаетесь присвоить ')'
с невыполнением Lvalue '(' || ch
.
Вы на самом деле повезло, там не parenthesising каждый член (которые многие люди), так, что бы сделать его синтаксически правильно, но не делать то, что вы ожидаете, во время выполнения:
if ((ch == '.') || (ch == '"') || (ch == '(') || (ch = ')') || ...
_________^^^^^^^^^^_________
will assign rather than test
Обычный подход, чтобы избежать то есть поставить постоянный первый, но, как вы, я считаю, что это просто некрасиво :
if (('.' == ch) || ('"' == ch) || ('(' == ch) || (')' = ch) || ...
^^^^^^^^
/urk! \
Когда я делаю такого рода вещи, я склонен полагаться на стандартной библиотеки, так что мой код выглядит лучше и имеет гораздо меньше шансов быть неправильно:
if (strchr (".\"()!,?;", ch) != NULL) {
// It's valid.
}
или даже лучше:
#define VALID_PUNCTUATION ".\"()!,?;"
if (strchr (VALID_PUNCTUATION, ch) != NULL) {
// It's valid.
}
или даже лучше, чем, поставить весь сегмент в функции и просто использовать что-то вроде:
if (isValidPunctuation (ch)) {
// It's valid.
}
(вы все равно должны будете убедиться, что код в функции является правильным, но ваша mainline код будет намного чище).
Ничего себе, какая глупая ошибка! Большое вам спасибо. – Ellea