2010-10-24 165 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 2010-10-24 10:39:03

+0

洛爾好抓,完全忘了這一點。 – jon2512chua 2010-10-24 11:08:45

回答

12

因爲!(options -> processHiddens)是一個表達式,而你並沒有使用結果的任何東西。你需要的東西,如:

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

噢,絲毫沒有察覺。一定是太累了。謝謝! – jon2512chua 2010-10-24 11:09:04

1

您的代碼:

!(options -> processHiddens); 

丟棄的觸發值,所以你得到的警告。你需要在變量的值切換回複製:

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

關於以前的答案,我不認爲options -> updateStatus是一個函數,否則編譯器會顯示錯誤抱怨。

至於翻轉狀態,!(options -> updateStatus)只是一個測試(可以這麼說)來確定options -> updateStatustrue還是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 */ 
相關問題