Pergunta

OI ,

Alguém pode me ajudar a entender por que o valor do quadrado (x) é 49?

Estou usando o Visual C ++ 6.0.

#define SQUARE(X) X * X

int main(int argc, char* argv[])
{
    int y = 5;

    printf("%d\n",SQUARE(++y));
    return 0;
}
Foi útil?

Solução

Neil Butterworth, Mark e Pavel estão certos.

O quadrado (++ y) se expande para ++ y * ++ y, que incrementa o dobro do valor de y.

Outro problema que você pode encontrar: o quadrado (a + b) se expande para a + b * a + b que não é (a + b) * (a + b), mas a + (b * a) + b. Você deve cuidar de adicionar parênteses em torno de elementos quando necessário ao definir macros: #Define Square (x) ((x) * (x)) é um pouco menos arriscado. (Ian Kemp escreveu primeiro em seu comentário)

Em vez disso, você pode usar uma função de modelo em linha (não menos eficiente em tempo de execução) como esta:

template <class T>
inline T square(T value)
{
    return value*value;
}

Você pode verificar se funciona:

int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;

(sem necessidade de escrever

square<int>(++i)

Porque o tipo int está implícito para i)

Outras dicas

Porque a macro se expande para:

++y * ++y

O que fornece comportamento indefinido em C ++ - o resultado pode ser qualquer coisa. Esse problema muito conhecido deve ser abordado em qualquer livro decente que cubra o uso de macros. Qual você está usando?

Porque macros fazem substituição textual, o código que você escreveu é expandido

printf("%d\n",++y * ++y );

E então a ordem das operações é um comportamento indefinido, portanto, o compilador vê 2 incrementos e depois uma multiplicação

Portanto, tenha cuidado com as macros melhor para usar as funções que, à medida que o compilador, podem expandir em linha não levarão mais a execução.

Em segundo lugar, não assuma o que acontecerá se você aumentar e usar variáveis

Macros não são funções: eles apenas alteram o texto do programa. Esta operação é chamada pré-processando E é executado automaticamente antes que seu código seja compilado. As pessoas escrevem macros para economizar seu tempo e introduzir alguma variabilidade em seu código -fonte.

Quando você escreve SQUARE(x), nenhuma chamada de funciton real acontece, apenas o texto é modificado. A operação é bastante burra, então você precisa fazer precauções adicionais em casos como o seu. Consulte outras respostas para explicar o seu caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top