Я хотел бы знать, если есть разница между:В чем разница между {0} и ""?
char s[32] = "";
и:
char s[32] = {0};
Спасибо.
Я хотел бы знать, если есть разница между:В чем разница между {0} и ""?
char s[32] = "";
и:
char s[32] = {0};
Спасибо.
Нет нет никакой разницы между этими двумя декларациями:
char bla[32] = {0};
and
char bla[32] = "";
См соответствующий пункт стандарта C (курсив мой):
(C99, 6.7.8p21) «Если есть меньшее количество инициализаторов в списке, заключенном в скобки, чем элементы или элементы совокупности, или меньшее количество символов в строковом литерале, используемом для инициализации массива известного размера, чем в массиве, остальная часть совокупности должна быть инициализируется неявно s ame как объекты, которые имеют статическую продолжительность хранения ».
Хорошо, спасибо большое! – md5
То есть, пока '' \ 0 '== 0'. – Philip
@Philip У меня нет цитаты из стандарта, но вот что говорит K & R 2nd * «Символьная константа '\ 0' представляет символ со значением 0, нулевой символ. '\ 0' часто записывается вместо 0 чтобы подчеркнуть характерный характер некоторого выражения, но числовое значение равно 0. * – ouah
В этом случае нет никакой разницы, как инициализирует все слоты массива 0. В общем, ""
работает только для char
массивов (с или без модификаций, как const
или unsigned
), но {0}
работает для массивов из цифр типы.
В разделе 6.7.9 стандарта (n1570), пункт 21 считывает
Если есть меньше инициализаторов в распорной корпусе списка, чем есть элементы или члены из совокупности, или меньше символов в строковом литерале, используемом для инициализации массива известного размера , чем в массиве есть элементы, остальная часть совокупности должна быть , неявно инициализированной так же, как объекты, имеющие статическую продолжительность хранения.
так что даже ""
инициализирует полный массив. не
+1 '{0}' работает для любого типа данных, которому разрешен инициализатор. С другой стороны, он * не разрешен для всех массивов, а именно не для VLA, так как они не должны иметь инициализаторы. –
Результат обоих выражений один и тот же: пустая строка. Тем не менее, первое является более явным, поэтому более читаемым.
Нет никакой разницы. Вы также можете убедиться сами! Это самый надежный ответ, который вы можете получить. Просто используйте отладчик. Выполните две линии и сравните результат. Но вы должны переименовать массивы. Я использую GCC/GDB и скомпилировать следующий код
int main(int argc, char* argv[])
{
char s[5] = {0};
char t[5] = "";
return 0;
}
с помощью GCC -g test.c и затем вызвать GDB a.out. В БГДЕ я вхожу
break 5
run
print s
последнее утверждение отвечает на GDB с следующим выводом:
$1 = "\000\000\000\000"
я продолжить и введите «печать т» и получить соответственно
$2 = "\000\000\000\000"
, который говорит мне, что с моим компилятором выбора оба утверждения приводят к тому же результату.
Matthias: это не самый надежный метод, так как любое поведение, которое не определено, может варьироваться в зависимости от реализаций компилятора или из-за различий в неинициализированном содержимом памяти .... –
@ tony-delroy я уточнил и надеюсь, что я сделал мой вопрос более ясным (я didn я действительно получаю ваш, хотя ...) – Matthias
Я хочу сказать, что знание того, что делает ваша программа для определенного запуска, не доказывает, что для C++ Standard требуется любой исполняемый файл, сгенерированный из этого исходного кода, любым компилятором C++. Если вам нужен надежный код, вы придерживаетесь того, что гарантирует стандарт, поскольку поведение наблюдаемой программы может меняться. Например, если вы читаете из неинициализированной переменной - 'int x; std :: cout << x << '\ n'; '- вы можете увидеть число, которое вы ожидаете случайно (особенно если вы ожидаете 0), но повторно запустите программу или перекомпилируйте ее, и вы можете получить другую продукцию .... –
В дополнение к тому, что уже было сказано:
char s[32] = "";
=
char s[32] = {'\0'};
=
char s[32] = {0};
=
char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 };
Все это приведет к точно тот же машинный код: 32-байтовый массив, заполненный всеми нулями.
Ответ дан. Но на всякий случай вам следует подумать, что нет разницы между '{0}' и '' "', попробуйте это с другими типами, например массивами 'int' вместо массивов' char'. Тогда вы увидите разницу. –