Я немного опоздал на вечеринку, но я все равно отвечу; технически те же биты, но с бит другой точки зрения (на языке C ниже):
В C выражение "a"
обозначает строковый литерал , который является статическим безымянным массивом const char
, с длиной два - массив состоит из символов 'a'
и '\0'
- завершающий нулевой символ обозначает конец строки.
Однако в C таким же образом вы не можете передавать массивы в функции по значению - или присваивать им значения ( после инициализации ) - для массивов нет перегруженного оператора ==
, поэтому это не так Можно сравнить их напрямую. Рассмотрим
int a1[] = {1, 2, 3};
int a2[] = {3, 4, 5};
a1 == a2 // is this meaningful? Yes and no; it *does* compare the arrays for
// "identity", but not for their values. In this case the result
// is always false, because the arrays (a1 and a2) are distinct objects
Если ==
не сравнивает массивы, что тогда он делает? В Си почти во всех контекстах, включая этот, массивы распадаются на указатели (которые указывают на первый элемент массива) - и сравнение указателей на равенство делает то, что вы ожидаете. Так эффективно, при этом
"a" == "a"
вы на самом деле сравниваете адреса первых символов в двух безымянных массивах . В соответствии со стандартом C сравнение может давать либо true, либо false (то есть 1 или 0) - "a"
s может фактически обозначать один и тот же массив или два совершенно не связанных массива. В технических терминах результирующее значение равно неопределено , что означает, что сравнение разрешено (т. Е. Это не неопределенное поведение или синтаксическая ошибка), но любое значение допустимо и реализация (ваш компилятор) не требуется документировать, что на самом деле произойдет.
Как уже отмечали другие, для сравнения "строк c" (то есть строк, оканчивающихся нулевым символом) вы используете вспомогательную функцию strcmp
, находящуюся в стандартном заголовочном файле string.h
. Функция имеет возвращаемое значение 0
для одинаковых строк; Рекомендуется явно сравнивать возвращаемое значение с 0
вместо использования оператора `! ´, т.е.
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)