Robiłem projekt uczelni. Napotkałem problem tutaj jest zbyt uproszczoną wersją tego problemu ..
#include <stdio.h>
#define h1 2
#define h2 3
#define h3 4
const int ar[] = {h1,h2,h3};
int main(int argc, char const *argv[]) {
for (size_t i = 0; i < 3; i++) {
switch (i) {
case ar[i]:
printf("yes!!!!!!!!");
}
}
return 0;
}
Pokazuje błąd. Nie rozumiem. Proszę wyjaśnić ... Dziękuję Ci.
Odpowiedzi:
1 dla odpowiedzi № 1case
wyrażenia muszą być stałe czasowe kompilacji. Ekspresja ar[i]
nie jest stałą czasu kompilacji, jest oceniana w czasie wykonywania.
Możesz to rozwiązać przez pewne refaktoryzacje:
switch (ar[i])
{
case h1:
printf("got h1n");
break;
}
Innym sposobem jest oczywiście użycie if
oświadczenia, jak w
if (i == ar[i]) { ... }
4 dla odpowiedzi nr 2
W języku C etykiety przypadków muszą być stałymi czasowymi kompilacji. w twoim kodzie ar [i] nie kompiluje stałej czasowej.
C11 6.8.4.2 Instrukcja zamiany (paragraf 3):
Wyrazem każdej etykiety przypadku jest stała całkowita wyrażenie i nie ma dwóch wyrażeń stałych w tym samym instrukcja switch powinna mieć tę samą wartość po konwersji.