2013-10-11 14 views
5

Voglio sapere se:controllo se un sacco di int è pari

val1 = val2 = val3 ... = val6 

provo questo:

if (val1 == val2 == val3 == val4 == val5 == val6) 
{ 


} 

ma non funzionano, perché?

+0

Sei di sfondo Python?il confronto composito non è presente in C –

risposta

18

L'operatore == funziona solo tra coppie di valori. Quando si esegue questa operazione:

val1 == val2 == val3 

ciò che sta realmente accadendo è questo:

(val1 == val2) == val3 

Quindi, se val1 e val2 sono uguali, l'espressione tra parentesi restituisce true:

true == val3 

E quindi controlla se true == val3, non se val1 o val2 == val3. Devi fare questo, invece:

val1 == val2 && val1 == val3 

Questo sta diventando abbastanza ingombrante per i sei variabili però. Hai davvero sei variabili locali che devi confrontare? Forse dovresti archiviarli in un array di qualche tipo. Poi si può fare:

bool all_equal(int *vals, int length) { 
    if (length == 0) { 
     return true; 
    } 
    int first = vals[0]; 
    for (int i=1; i < length; i++) { 
     if (vals[i] != first) { 
      return false; 
     } 
    } 
    return true; 
} 

Così, invece di:

int val1 = ..., val2 = ..., val3 = ..., val4 = ..., val5 = ..., val6 = ...; 
if (val1 == val2 && val2 == val3 && val3 == val4 && val4 == val5 && val5 == val6) { 
    ... 
} 

si farebbe:

int vals[6] = {..., ..., ..., ..., ..., ...}; 
if (all_equal(vals, 6)) { 
    ... 
} 
8

Non è possibile concatenare l'operatore ==. A questo scopo:

if (val1 == val2 && val2 == val3 && val3 == val4 && val4 == val5 && val5 == val6) { 
    // they are all equal 
} 
0

Vorrei suggerire a scrivere una macro o una funzione (se si tratta di array con grande dimensione o se è allocato in fase di esecuzione) in questo caso.

+1

Questo tipo di risposta lascia fuori i bit importanti. – rmaddy

+0

@rmaddy bene, tutti gli altri hanno già detto se (a == b && b == c ...) – wirm

1

Il problema di errore è già abilmente spiegato da altri utenti, volevo solo condividere un altro approccio.

ho scritto un codice C con numero variabile di argomenti: 9.9. Variable numbers of arguments Spero che troverete interessante

#include<stdio.h> 
#include<stdarg.h>  
typedef enum {FALSE, TRUE} boolean; 
boolean isAllEqual(int count, ...){ 
    va_list ap; // vlist variable 
    int num = 0; 
    boolean flag = TRUE; 
    //Step2: To initialize `ap` using right-most argument that is `c` 
    va_start(ap, count); 

    //Step3: Now access vlist `ap` elements using va_arg() 
    num = va_arg(ap, int); 
    while(--count){ 
     if (num != va_arg(ap, int)){ 
      flag = FALSE; 
      break; 
     } 
    } 
    //Step4: Now work done, we should reset pointer to NULL 
    va_end(ap); 
    return flag? TRUE: FALSE; 
} 
int main(){ 
    if(isAllEqual(5, 2, 2, 2, 2, 2)) 
     printf(" Yes, All are equal\n"); 
    else 
     printf(" No, All are NOT equal\n"); 

    if(isAllEqual(4, 2, 4, 2, 5)) 
     printf(" Yes, All are equal\n"); 
    else 
     printf(" No, All are NOT equal\n"); 
    return 0; 
} 

uscita:

Yes, All are equal 
No, All are NOT equal 

Controllare codepade.

La mia funzione boolean isAllEqual(int count, ...) può controllare qualsiasi numero di numeri interi, conteggio = numero di valori che si desidera confrontare. per esempio. In isAllEqual(4, 2, 4, 2, 5) il primo 4 indica che si desidera confrontare i quattro valori seguenti.

A short theory in four points will help you to understand my code.

Problemi correlati