Ambas declaraciones funcionan de la misma manera:
int x = 5; int x = {5};Eso también es cierto cuando intento:
char str[] = "hello"; char str[] = {"hello"};¿Cómo define el lenguaje inicializar una variable usando llaves?
Hay tres casos diferentes de inicialización que se aplican aquí:
Para variables/punteros simples, llamados formalmente escalares , entonces C17 6.7.9 §11 dice que puede agregar llaves opcionalmente si lo desea:
El inicializador de un escalar será una sola expresión, opcionalmente encerrada entre llaves.
Luego, §14 menciona específicamente las matrices de caracteres: se pueden inicializar con un literal de cadena. Y nuevamente, opcionalmente pueden tener llaves:
Una matriz de tipo de carácter se puede inicializar mediante un literal de cadena de caracteres o un literal de cadena UTF–8, opcionalmente encerrado entre llaves.
Finalmente, §16 se ocupa de todos los demás inicializadores de agregados (matrices o estructuras) y uniones, las llaves ya no son opcionales sino obligatorias:
De lo contrario, el inicializador para un objeto que tiene un tipo agregado o unión será una lista de inicializadores entre llaves para los elementos o miembros nombrados.
Esto hace posible escribir todas las listas de inicializadores con una sintaxis consistente y usando {} sin importar qué tipo esté inicializando la lista de inicializadores. Lo que a su vez puede ser útil al escribir macros de tipo genérico y similares.
No hay diferencia. En el estándar C11, §6.7.9p11 describe este caso:
El inicializador de un escalar será una sola expresión, opcionalmente encerrada entre llaves. El valor inicial del objeto es el de la expresión (después de la conversión); se aplican las mismas restricciones de tipo y conversiones que para la asignación simple, tomando el tipo del escalar como la versión no calificada de su tipo declarado.
Tanto el número entero como el puntero son tipos escalares (ver §6.2.5p21 ).
(Es lo mismo en C89 , el documento no es tan bueno para enlazar).