Member 13922884 Ответов: 3

Использование значения указателя в случае переключателя.


#include <stdio.h>
int main() {
	//code
	int i=5;
	int *p=&i;
	printf ("%d", *p);
	switch (*p)
	{
	    case *p:
                printf ("&&");
                break;
	}
	return 0;
}


*p дает значение i. Тогда почему эта программа работает с ошибкой?

Что я уже пробовал:

Оператор Switch работает с интегральными выражениями, а указатель не является интегральным выражением. Но я передаю значение, на которое указывает указатель, равное 5. так что же, это не должно выполняться?

3 Ответов

Рейтинг:
2

Nelek

От оператор switch в языке C[^]

Цитата:

К оператору switch применяются следующие правила

- Выражение, используемое в операторе switch, должно иметь интегральный или перечислимый тип или принадлежать типу класса, в котором класс имеет единственную функцию преобразования в интегральный или перечислимый тип.

- Вы можете иметь любое количество операторов case в коммутаторе. За каждым случаем следует значение для сравнения и двоеточие.

- Константа-выражение для случая должно быть того же типа данных, что и переменная в коммутаторе, и это должна быть константа или литерал.

- Если включаемая переменная равна регистру, то операторы, следующие за этим регистром, будут выполняться до тех пор, пока не будет достигнут оператор break.

- Когда оператор break достигнут, коммутатор завершается, и поток управления переходит к следующей строке после оператора switch.

- Не каждый случай должен содержать перерыв. Если никакого разрыва не происходит, поток управления будет переходить к последующим случаям, пока не будет достигнут разрыв.

- Оператор switch может иметь необязательный регистр по умолчанию, который должен отображаться в конце коммутатора. Регистр по умолчанию может использоваться для выполнения задачи, если ни один из этих регистров не является истинным. В случае по умолчанию перерыв не требуется.

Я думаю, что ваш указатель не вписывается в Правило номер один.


Рейтинг:
13

0x01AA

Вот этот switch (*p) пока все в порядке. Но вот этот case *p: быть проблемой.
Почему?
Взгляните на определение оператора Switch в языке c, например здесь: оператор switch (C)[^]
Определение гласит: case constant-expression : а значит, вам нужно использовать постоянное выражение для "case part", в то время как *p является переменной (разыменованный указатель) и поэтому здесь не допускается.

Надеюсь, это поможет.


Member 13922884

Не следует ли заменить *p его значением, на которое он ссылается?
Когда он выполняется, разве он не идет как случай 5: ... ?

0x01AA

Не уверен, что правильно понял. Но чтобы заставить его работать, вы должны заменить *p на постоянное значение 5:

case 5:

Опять же, значение case должно быть постоянным значением (в C), и поэтому переменная здесь не допускается.

Member 13922884

Ох... моя вина. Я понял, к чему ты клонишь. Большое спасибо.

0x01AA

Добро пожаловать, это помогло и мне учиться. Спасибо, что согласились.

Рейтинг:
0

Patrice T

Цитата:
Использование значения указателя в случае переключателя.

Короткий ответ: Для того, что вы хотите, это так если структура, а не переключатель.