Desafio C++

Inicialização com chaves e narrowing

Enunciado

Escreva um programa que demonstre a prevenção de narrowing usando inicialização com chaves. Declare int a{10};, double b{3.14}; e tente declarar int c{3.14}; (deve causar erro de compilação). Comente a linha problemática e, em vez disso, declare int d{static_cast<int>(3.14)};. Imprima a, b e d com rótulos. Explique em comentário por que int c{3.14} não compila.

Requisitos

  • Usar inicialização com chaves para a, b e d.
  • Comentar a linha int c{3.14}; e explicar o erro.
  • Usar static_cast<int> para converter 3.14 para inteiro.
  • Imprimir a: 10, b: 3.14 e d: 3 em linhas separadas.

Código inicial

#include <iostream>

int main() {
    // Declare a, b e d com chaves

    // int c{3.14}; // por que não compila?

    // Imprima os valores
    return 0;
}

Saída esperada

a: 10
b: 3.14
d: 3
Ver dica

Narrowing ocorre quando um valor de ponto flutuante é convertido para inteiro sem perda explícita.

Mostrar solução
#include <iostream>

int main() {
    int a{10};               // inicialização com chaves
    double b{3.14};          // double com chaves

    // int c{3.14};          // ERRO: narrowing conversion de double para int
    // O compilador rejeita porque 3.14 não é um inteiro exato.

    int d{static_cast<int>(3.14)};  // conversão explícita, sem narrowing

    std::cout << "a: " << a << "\n";
    std::cout << "b: " << b << "\n";
    std::cout << "d: " << d << "\n";
    return 0;
}

Passo a passo

  1. int a{10}; inicializa um inteiro com chaves, sem problemas.
  2. double b{3.14}; inicializa um double com chaves, sem problemas.
  3. A linha int c{3.14}; é comentada porque o compilador detecta narrowing: 3.14 não cabe exatamente em um int.
  4. Usamos static_cast<int>(3.14) para converter explicitamente, assumindo a perda da parte fracionária.
  5. int d{...} inicializa d com o valor convertido (3).
  6. Imprimimos os três valores.

Por que funciona

A inicialização com chaves proíbe conversões que perdem informação (narrowing). Ao usar static_cast, informamos ao compilador que a conversão é intencional, permitindo a compilação.

Erros comuns

  • Descomentar int c{3.14}; e tentar compilar: erro de narrowing.
  • Usar int c = 3.14; em vez de chaves: compila, mas trunca silenciosamente para 3, o que pode ser indesejado.
  • Esquecer o static_cast e usar int d{3.14}; diretamente: mesmo erro de narrowing.

Outra forma de resolver

Poderia usar int d = static_cast<int>(3.14); com sinal de igual, mas a inicialização com chaves é preferível por ser mais segura.

Saída esperada

a: 10
b: 3.14
d: 3