2010-10-24 2 views
0

Ниже мой кодПочему я получаю предупреждение «заявление без эффекта»?

/* Initialise default without options input. */ 
options -> processHiddens = false; 
options -> timeResolution = DEFAULT_MOD_TIMES; 
options -> performSync = true; 
options -> recursive = false; 
options -> print = false; 
options -> updateStatus = true; 
options -> verbose = false; 
options -> programname = malloc(BUFSIZ); 
options -> programname = argv[0]; 

while ((opt = getopt(argc, argv, OPTLIST)) != -1) 
{ 
    switch (opt) 
    { 
     case 'a': 
      !(options -> processHiddens); 
     case 'm': 
      options -> timeResolution = atoi(optarg); 
     case 'n': 
      !(options -> performSync); 
     case 'p': 
      !(options -> print); 
     case 'r': 
      !(options -> recursive); 
     case 'u': 
      !(options -> updateStatus); 
     case 'v': 
      !(options -> verbose); 
     default: 
      argc = -1; 
    } 
} 

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

!(options -> processHiddens); 

вместо просто

options -> processHiddens = true; 

Однако я получаю следующее предупреждение при компиляции:

mysync.c: In function ‘main’: 
mysync.c:32: warning: statement with no effect 
mysync.c:36: warning: statement with no effect 
mysync.c:38: warning: statement with no effect 
mysync.c:40: warning: statement with no effect 
mysync.c:42: warning: statement with no effect 
mysync.c:44: warning: statement with no effect 
+4

использования 'перерыва;' между вашими случаями, пожалуйста! – Benoit

+0

Lol good catch, полностью забыл об этом. – jon2512chua

ответ

12

Потому что !(options -> processHiddens) - это выражение, и вы не присваиваете результат чему-либо. Вам нужно что-то вроде:

options->processHiddens = !options->processHiddens; 
+0

О да, даже не заметил. Должно быть, слишком устал. Благодаря! – jon2512chua

1

Вашего кода:

!(options -> processHiddens); 

сброшенных переключено значением, следовательно, вы получите предупреждение. Вам нужно скопировать переключены значение обратно в переменной:

options -> processHiddens = ! options -> processHiddens; 
0

Что касается предыдущего ответа, я не думаю, что options -> updateStatus является функцией, так как в противном случае компилятор будет жаловаться с ошибкой.

Что касается листать состояния, !(options -> updateStatus) просто тест (так сказать), чтобы определить, если options -> updateStatus является true или false.

Что вам нужно это: options->updateStatus = !options->updateStatus

5

Поскольку !(options -> processHiddens); "такой же, как" 40 + 2. Это на самом деле не имеет никакого эффекта :-)

printf("foo"); 
40 + 2; 
printf("bar"); 

вы хотите

option -> processHiddens = !(options -> processHiddens); 
break;  /* without break, all the following lines will execute */ 
Смежные вопросы