2010-04-23 15 views

Odpowiedz

115

NSInteger jest zdefiniowana jako int (lub long w niektórych środowiskach). Sprawdzanie osobliwości jest jak w przypadku int:

NSInteger num; 
if (num % 2) 
    // odd 
else 
    // even 
+0

Nie działa też. http://cl.ly/c7k. – Joshua

+0

coś musi być nie tak z definicją zmiennej "integer".W każdym razie lubię odpowiedź Horace'a więcej – Vladimir

+0

Definicja to: \t 'NSInteger * integer;' – Joshua

17
NSInteger n = 5; 

NSLog(@"%s", n & 1 ? "odd" : "even"); 

lub za pomocą jeśli

if (n & 1) { 
    ; // odd 
} else { 
    ; // even 
} 

niektóre wyjściowej:

if (n & 1) { 
    NSLog(@"odd"); 
} else { 
    NSLog(@"even"); 
} 

przykład wskaźnik:

NSInteger x = 7; 
NSInteger *y = &x; 

if (*y & 1) { 
    NSLog(@"odd"); 
} else { 
    NSLog(@"even"); 
} 
+0

Jak umieścić to w oświadczeniu "jeśli"? – Joshua

+0

"jeśli" dodano sposób. – ohho

+0

Z jakiegoś powodu sposób "if" nie działa. http://cl.ly/ceo – Joshua

8

O ile mi wiadomo. NSInteger, w przeciwieństwie NSNumber, to tylko typeder do rzeczywistego typu całkowitego wzdłuż linii:

typedef long NSInteger; 

więc powinieneś być w stanie to zrobić:

NSInteger nsintvar = 77; 
if ((nsintvar % 2) == 0) { 
    // number is even 
} else { 
    // number is odd 
} 

Oto kompletny program, opracowywane pod Cygwin z GNUstep, który to ilustruje:

#import <stdio.h> 
#import <Foundation/NSObject.h> 

int main(int argc, const char *argv[]) { 
    NSInteger num; 
    for (num = 0; num < 20; num++) { 
     if ((num % 2) == 0) { 
      printf ("%d is even\n", num); 
     } else { 
      printf ("%d is odd\n", num); 
     } 
    } 
    return 0; 
} 

Otrzymuje:

0 is even 
1 is odd 
2 is even 
3 is odd 
4 is even 
5 is odd 
6 is even 
7 is odd 
8 is even 
9 is odd 
10 is even 
11 is odd 
12 is even 
13 is odd 
14 is even 
15 is odd 
16 is even 
17 is odd 
18 is even 
19 is odd 
+0

Nie wydaje się działać. http://cl.ly/Zdg – Joshua

+0

Czy na pewno deklarujesz zmienną jako NSInteger? Widziałem tylko ten problem ("Nieprawidłowe operandy dla binarnego X", gdzie X jest prawidłowym operatorem C), kiedy deklarujesz zmienną jako NSInteger * (wskaźnik zamiast rzeczywistej liczby całkowitej). Wypróbuj pełny program w mojej edycji. – paxdiablo

+0

Myślę, że ta odpowiedź jest najlepsza. '((nsintvar% 2) == 0)' jest bardziej zwięzły; nie miesza typów bool i integer. – capikaw

3

Te inne odpowiedzi powinny działać. Może to problem z plikiem Makefile lub czymś podobnym. Pomyśl o tym kawałku kodu.

Jeśli wszystko inne zawiedzie, po prostu zadeklaruj liczbę całkowitą jako int. Nie musisz deklarować go jako NSInteger.

2

Użyj operatora "%". Zasadniczo działa ona na pozostałą część, gdy dzielisz liczbę. Więc:

liczba% 2

Byłoby = 0 jeśli liczba była parzysta, jako parzysta liczba dzieli się przez 2 ma żadnych pozostałości. Jeśli nie = 0, musi być nieparzyste.

0
NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", nil]; 

NSArray *arrLeft; 
NSArray *arrRight; 

NSRange range; 
range.location = 0; 
range.length = ([arrayTotal count] % 2) ? ([arrayTotal count]/2) + 1 : ([arrayTotal count]/2); 

arrLeft = [arrayTotal subarrayWithRange:range]; 

range.location = range.length; 
range.length = [arrayTotal count] - range.length; 

arrRight = [arrayTotal subarrayWithRange:range]; 

NSLog(@"Objects: %lu", (unsigned long)[arrLeft count]); 
NSLog(@"%@", [arrLeft description]); 

NSLog(@"Objects: %lu", (unsigned long)[arrRight count]); 
NSLog(@"%@", [arrRight description]); 

Mam nadzieję, że pomoże!

Powiązane problemy