O programa C a seguir tem garantia de saída 0
ou o compilador tem permissão para identificar os objetos s
e t
uns com os outros, conforme permitido em C++, como a chamada forma de elisão de cópia de otimização de valor de retorno nomeado (NRVO)?
typedef struct {
int i, j;
double a, b;
} S;
int result;
S test(S* q) {
S s = {0, 0, 0, 0};
result = &s == q;
return s;
}
int main(void)
{
S t = test(&t);
return result;
}
Clang sai 1
contra minhas expectativas, consulte https://godbolt.org/z/ME8sPGn3n .
(Em C++, ambos 0
e 1
são resultados válidos devido à permissão explícita para executar NRVO.)
É garantido que sairá com 0.
t
es
são objetos diferentes, os ponteiros para eles não podem ser comparados iguais.Sobre o código que você removeu:
De https://port70.net/~nsz/c/c11/n1570.html#6.2.4p2 :
Pode retornar 1 ou 0 ou executar uma armadilha.