Я разделяю многие оговорки по поводу кода, показанного в пробном тесте №1 для C в TutorialsPoint . Использование кода, недопустимого для C99, не говоря уже о C11 или C17, выглядит странно. Код из прошлого тысячелетия все еще не следует преподавать новым программистам - за исключением наглядных уроков о том, как язык изменился с момента его первой стандартизации. Вопрос SO и основной ответ были изменены, чтобы удалить комментарий к этому единственному вопросу.
Код для Q3:
#include<stdio.h>
main()
{
char s[]="hello", t[]="hello";
if(s==t){
printf("eqaul strings");
}
}
Массивы s
и t
должны находиться в разных местах; они представляют собой отдельные массивы, инициализируемые одной и той же строкой, но все же отдельные массивы и, следовательно, хранящиеся по разным адресам. Условное выражение сравнивает адреса, по которым хранятся массивы (для сильного сравнения будет использоваться strcmp()
или эквивалент), а массивы хранятся по отдельным адресам, поэтому результат сравнения ложный.
- Следовательно , единственный правильный ответ: C - Нет вывода.
- Это ответ, данный TutorialsPoint в их ключе.
Было некоторое обсуждение SO строковых литералов и факт, что они могут храниться в одном месте. Однако это обсуждение было ошибочным; это не относится к этому коду. Строки, используемые для инициализации массивов, могут быть размещены вместе, но сами массивы не могут быть размещены вместе. Однако предположим, что определения были указателями, а не массивами:
char *s = "hello", *t = "hello";
Теперь вполне возможно, что s
и t
содержат один и тот же адрес, хотя также возможно, что они содержат разные адреса . (Адреса s
и t
должны быть разными; это две отдельные переменные-указатели).
Но инициализаторы массива в коде в вопросе должны инициализировать два отдельных массива, и эти отдельные массивы должны храниться по разным адресам, поэтому сравнение s == t
в вопросе должно быть ложным, поэтому ничего не печатается.