2012-04-25 4 views
7

Я хотел бы знать, если есть разница между:В чем разница между {0} и ""?

char s[32] = ""; 

и:

char s[32] = {0}; 

Спасибо.

+0

Ответ дан. Но на всякий случай вам следует подумать, что нет разницы между '{0}' и '' "', попробуйте это с другими типами, например массивами 'int' вместо массивов' char'. Тогда вы увидите разницу. –

ответ

18

Нет нет никакой разницы между этими двумя декларациями:

char bla[32] = {0}; 

and 

char bla[32] = ""; 

См соответствующий пункт стандарта C (курсив мой):

(C99, 6.7.8p21) «Если есть меньшее количество инициализаторов в списке, заключенном в скобки, чем элементы или элементы совокупности, или меньшее количество символов в строковом литерале, используемом для инициализации массива известного размера, чем в массиве, остальная часть совокупности должна быть инициализируется неявно s ame как объекты, которые имеют статическую продолжительность хранения ».

+0

Хорошо, спасибо большое! – md5

+1

То есть, пока '' \ 0 '== 0'. – Philip

+2

@Philip У меня нет цитаты из стандарта, но вот что говорит K & R 2nd * «Символьная константа '\ 0' представляет символ со значением 0, нулевой символ. '\ 0' часто записывается вместо 0 чтобы подчеркнуть характерный характер некоторого выражения, но числовое значение равно 0. * – ouah

10

В этом случае нет никакой разницы, как инициализирует все слоты массива 0. В общем, "" работает только для char массивов (с или без модификаций, как const или unsigned), но {0} работает для массивов из цифр типы.

В разделе 6.7.9 стандарта (n1570), пункт 21 считывает

Если есть меньше инициализаторов в распорной корпусе списка, чем есть элементы или члены из совокупности, или меньше символов в строковом литерале, используемом для инициализации массива известного размера , чем в массиве есть элементы, остальная часть совокупности должна быть , неявно инициализированной так же, как объекты, имеющие статическую продолжительность хранения.

так что даже "" инициализирует полный массив. не

+0

+1 '{0}' работает для любого типа данных, которому разрешен инициализатор. С другой стороны, он * не разрешен для всех массивов, а именно не для VLA, так как они не должны иметь инициализаторы. –

2

Результат обоих выражений один и тот же: пустая строка. Тем не менее, первое является более явным, поэтому более читаемым.

2

Нет никакой разницы. Вы также можете убедиться сами! Это самый надежный ответ, который вы можете получить. Просто используйте отладчик. Выполните две линии и сравните результат. Но вы должны переименовать массивы. Я использую 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" 

, который говорит мне, что с моим компилятором выбора оба утверждения приводят к тому же результату.

+3

Matthias: это не самый надежный метод, так как любое поведение, которое не определено, может варьироваться в зависимости от реализаций компилятора или из-за различий в неинициализированном содержимом памяти .... –

+0

@ tony-delroy я уточнил и надеюсь, что я сделал мой вопрос более ясным (я didn я действительно получаю ваш, хотя ...) – Matthias

+1

Я хочу сказать, что знание того, что делает ваша программа для определенного запуска, не доказывает, что для C++ Standard требуется любой исполняемый файл, сгенерированный из этого исходного кода, любым компилятором C++. Если вам нужен надежный код, вы придерживаетесь того, что гарантирует стандарт, поскольку поведение наблюдаемой программы может меняться. Например, если вы читаете из неинициализированной переменной - 'int x; std :: cout << x << '\ n'; '- вы можете увидеть число, которое вы ожидаете случайно (особенно если вы ожидаете 0), но повторно запустите программу или перекомпилируйте ее, и вы можете получить другую продукцию .... –

2

В дополнение к тому, что уже было сказано:

char s[32] = ""; 

=

char s[32] = {'\0'}; 

=

char s[32] = {0}; 

=

char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 }; 

Все это приведет к точно тот же машинный код: 32-байтовый массив, заполненный всеми нулями.

Смежные вопросы