MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

一文读懂Objective-C的表达式与语句

2022-10-173.0k 阅读

表达式基础

在Objective - C中,表达式是由操作数(operand)和运算符(operator)组成的。操作数可以是常量、变量、函数调用等,而运算符则用于对操作数进行各种操作。表达式会产生一个值,这个值的类型取决于表达式中操作数和运算符的类型。

算术表达式

  1. 基本算术运算符 Objective - C提供了常见的算术运算符,如加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
// 定义两个整数变量
int num1 = 10;
int num2 = 3;

// 加法运算
int sum = num1 + num2;
NSLog(@"加法结果: %d", sum);

// 减法运算
int difference = num1 - num2;
NSLog(@"减法结果: %d", difference);

// 乘法运算
int product = num1 * num2;
NSLog(@"乘法结果: %d", product);

// 除法运算
int quotient = num1 / num2;
NSLog(@"除法结果: %d", quotient);

// 取模运算
int remainder = num1 % num2;
NSLog(@"取模结果: %d", remainder);

在上述代码中,首先定义了两个整数变量num1num2,然后分别进行了加、减、乘、除和取模运算,并使用NSLog函数输出结果。需要注意的是,在整数除法中,结果会截断小数部分。

  1. 自增和自减运算符 自增(++)和自减(--)运算符用于将变量的值增加或减少1。它们有两种形式:前缀形式(如++a)和后缀形式(如a++)。
int a = 5;
int b = ++a; // 前缀自增,a先自增1,然后赋值给b,此时a = 6,b = 6
NSLog(@"前缀自增: a = %d, b = %d", a, b);

int c = 5;
int d = c++; // 后缀自增,c先赋值给d,然后c自增1,此时c = 6,d = 5
NSLog(@"后缀自增: c = %d, d = %d", c, d);

int e = 5;
int f = --e; // 前缀自减,e先自减1,然后赋值给f,此时e = 4,f = 4
NSLog(@"前缀自减: e = %d, f = %d", e, f);

int g = 5;
int h = g--; // 后缀自减,g先赋值给h,然后g自减1,此时g = 4,h = 5
NSLog(@"后缀自减: g = %d, h = %d", g, h);

在这个代码示例中,展示了自增和自减运算符的前缀和后缀形式的不同行为。前缀形式先对变量进行自增或自减操作,然后使用新的值;后缀形式则先使用变量原来的值,然后再进行自增或自减操作。

关系表达式

关系表达式用于比较两个操作数的大小关系,其结果是一个布尔值(YESNO)。常见的关系运算符有大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)。

int num3 = 10;
int num4 = 5;

BOOL isGreater = num3 > num4;
NSLog(@"num3 > num4: %@", isGreater? @"YES" : @"NO");

BOOL isLess = num3 < num4;
NSLog(@"num3 < num4: %@", isLess? @"YES" : @"NO");

BOOL isGreaterOrEqual = num3 >= num4;
NSLog(@"num3 >= num4: %@", isGreaterOrEqual? @"YES" : @"NO");

BOOL isLessOrEqual = num3 <= num4;
NSLog(@"num3 <= num4: %@", isLessOrEqual? @"YES" : @"NO");

BOOL isEqual = num3 == num4;
NSLog(@"num3 == num4: %@", isEqual? @"YES" : @"NO");

BOOL isNotEqual = num3 != num4;
NSLog(@"num3 != num4: %@",isNotEqual? @"YES" : @"NO");

上述代码通过比较num3num4的值,使用不同的关系运算符得到相应的布尔结果,并使用NSLog函数输出。这里使用了条件运算符(? :)来将布尔值转换为字符串输出。

逻辑表达式

逻辑表达式用于组合多个关系表达式或其他逻辑表达式,以形成更复杂的条件判断。Objective - C提供了逻辑与(&&)、逻辑或(||)和逻辑非(!)运算符。

  1. 逻辑与(&& 只有当两个操作数都为YES时,逻辑与表达式的结果才为YES,否则为NO
BOOL condition1 = YES;
BOOL condition2 = NO;

BOOL resultAnd = condition1 && condition2;
NSLog(@"逻辑与结果: %@", resultAnd? @"YES" : @"NO");

在这个例子中,condition1YEScondition2NO,所以resultAndNO

  1. 逻辑或(|| 只要两个操作数中有一个为YES,逻辑或表达式的结果就为YES,只有当两个操作数都为NO时,结果才为NO
BOOL condition3 = YES;
BOOL condition4 = NO;

BOOL resultOr = condition3 || condition4;
NSLog(@"逻辑或结果: %@", resultOr? @"YES" : @"NO");

这里condition3YES,所以resultOrYES

  1. 逻辑非(! 逻辑非运算符用于对一个布尔值取反,即如果操作数为YES,则结果为NO;如果操作数为NO,则结果为YES
BOOL condition5 = YES;

BOOL resultNot =!condition5;
NSLog(@"逻辑非结果: %@", resultNot? @"YES" : @"NO");

由于condition5YES,经过逻辑非运算后,resultNotNO

赋值表达式

赋值表达式用于将一个值赋给一个变量。在Objective - C中,最基本的赋值运算符是=

int value = 10; // 将10赋值给变量value
NSLog(@"value的值: %d", value);

除了基本的赋值运算符,Objective - C还提供了复合赋值运算符,如+=-=*=/=%=等。这些复合赋值运算符将算术运算和赋值操作结合在一起。

int num5 = 5;
num5 += 3; // 等价于num5 = num5 + 3;
NSLog(@"num5 += 3后的值: %d", num5);

int num6 = 10;
num6 *= 2; // 等价于num6 = num6 * 2;
NSLog(@"num6 *= 2后的值: %d", num6);

在上述代码中,分别展示了+=*=复合赋值运算符的使用,它们简化了代码,提高了可读性。

条件表达式

条件表达式(也称为三元运算符)的形式为condition? expression1 : expression2。如果conditionYES,则返回expression1的值;否则返回expression2的值。

int num7 = 10;
int num8 = 5;
int max = num7 > num8? num7 : num8;
NSLog(@"较大值: %d", max);

在这个例子中,通过条件表达式比较num7num8的大小,将较大的值赋给max变量,并输出。

逗号表达式

逗号表达式是由逗号分隔的多个表达式组成,其形式为expression1, expression2, …, expressionN。逗号表达式从左到右依次计算每个表达式的值,最后返回最后一个表达式的值。

int result1 = (1 + 2, 3 + 4);
NSLog(@"逗号表达式结果: %d", result1);

在上述代码中,首先计算1 + 2,其结果被忽略,然后计算3 + 4,最终逗号表达式的值为7,并赋给result1

强制类型转换表达式

在Objective - C中,有时需要将一个表达式的值从一种数据类型转换为另一种数据类型。强制类型转换表达式的形式为(type)expression,其中type是目标数据类型,expression是要转换的表达式。

double num9 = 5.5;
int intValue = (int)num9;
NSLog(@"强制类型转换后的值: %d", intValue);

在这个例子中,将double类型的num9强制转换为int类型,小数部分会被截断,intValue的值为5

语句基础

语句是Objective - C程序中执行特定操作的基本单位。一个完整的Objective - C程序由一系列语句组成。语句通常以分号(;)结尾。

表达式语句

任何表达式后面加上分号就构成了表达式语句。例如,赋值表达式a = 10;就是一个表达式语句,它将值10赋给变量a

int b = 5;
b += 3; // 这是一个表达式语句,对b进行加法赋值操作
NSLog(@"b的值: %d", b);

在上述代码中,b += 3;是一个表达式语句,执行了对变量b的加法赋值操作。

空语句

空语句是只有一个分号的语句,它不执行任何操作。空语句有时用于在语法上需要一个语句,但逻辑上不需要执行任何操作的地方。

for (int i = 0; i < 10; i++) {
    // 这里使用空语句,因为在循环体中暂时不需要执行任何操作
    ;
}

在这个for循环中,循环体为空语句,循环仅仅是让i0递增到9

复合语句

复合语句(也称为块语句)是由一对花括号({})括起来的一组语句。复合语句在语法上被视为单个语句。

int x = 5;
int y = 3;
{
    int sum = x + y;
    NSLog(@"复合语句内的和: %d", sum);
}
// 这里不能访问sum变量,因为它的作用域仅限于复合语句内

在上述代码中,花括号内定义了一个新的变量sum并计算了xy的和,sum的作用域仅限于复合语句内部。

控制语句

控制语句用于控制程序的执行流程,根据条件决定执行哪些语句。

if - else语句

if - else语句用于根据条件执行不同的代码块。其基本形式为:

if (condition) {
    // 如果condition为YES,执行这里的语句
} else {
    // 如果condition为NO,执行这里的语句
}
int age = 18;
if (age >= 18) {
    NSLog(@"成年人");
} else {
    NSLog(@"未成年人");
}

在这个例子中,根据age的值判断是否为成年人,并输出相应的信息。

if - else语句还可以嵌套使用,以处理更复杂的条件判断。

int score = 85;
if (score >= 90) {
    NSLog(@"优秀");
} else if (score >= 80) {
    NSLog(@"良好");
} else if (score >= 60) {
    NSLog(@"及格");
} else {
    NSLog(@"不及格");
}

这个代码根据score的值进行多层条件判断,输出不同的评价。

switch - case语句

switch - case语句用于根据一个整数表达式的值来选择执行不同的代码块。其基本形式为:

switch (expression) {
    case constant1:
        // 如果expression的值等于constant1,执行这里的语句
        break;
    case constant2:
        // 如果expression的值等于constant2,执行这里的语句
        break;
    default:
        // 如果expression的值不等于任何一个case常量,执行这里的语句
        break;
}
int day = 3;
switch (day) {
    case 1:
        NSLog(@"星期一");
        break;
    case 2:
        NSLog(@"星期二");
        break;
    case 3:
        NSLog(@"星期三");
        break;
    default:
        NSLog(@"其他日期");
        break;
}

在这个例子中,根据day的值输出对应的星期几。break语句用于跳出switch语句,防止继续执行下一个case块。

for循环语句

for循环用于重复执行一段代码,它有三个表达式:初始化表达式、条件表达式和更新表达式。其基本形式为:

for (initialization; condition; update) {
    // 循环体
}
for (int i = 0; i < 5; i++) {
    NSLog(@"i的值: %d", i);
}

在这个例子中,i0开始,每次循环i自增1,当i小于5时,执行循环体,输出i的值。

while循环语句

while循环在条件为YES时重复执行一段代码。其基本形式为:

while (condition) {
    // 循环体
}
int count = 0;
while (count < 3) {
    NSLog(@"count的值: %d", count);
    count++;
}

在这个例子中,当count小于3时,执行循环体,输出count的值,并将count自增1

do - while循环语句

do - while循环与while循环类似,但它先执行一次循环体,然后再检查条件。其基本形式为:

do {
    // 循环体
} while (condition);
int num10 = 0;
do {
    NSLog(@"num10的值: %d", num10);
    num10++;
} while (num10 < 3);

在这个例子中,无论条件是否满足,都会先执行一次循环体,然后再判断条件,当num10小于3时,继续执行循环体。

break和continue语句

  1. break语句 break语句用于立即终止循环或switch - case语句。在循环中使用break可以提前结束循环。
for (int j = 0; j < 10; j++) {
    if (j == 5) {
        break;
    }
    NSLog(@"j的值: %d", j);
}

在这个for循环中,当j等于5时,执行break语句,提前结束循环,所以只会输出j04的值。

  1. continue语句 continue语句用于跳过当前循环体中剩余的语句,直接开始下一次循环。
for (int k = 0; k < 10; k++) {
    if (k % 2 == 0) {
        continue;
    }
    NSLog(@"k的值: %d", k);
}

在这个for循环中,当k是偶数时,执行continue语句,跳过本次循环剩余的输出语句,直接进入下一次循环,所以只会输出奇数。

函数调用语句

函数调用语句是通过调用函数来执行特定的操作。在Objective - C中,函数调用的一般形式为functionName(arguments);

// 定义一个简单的函数
int add(int a, int b) {
    return a + b;
}

int result2 = add(3, 5);
NSLog(@"函数调用结果: %d", result2);

在这个例子中,首先定义了一个add函数,它接受两个整数参数并返回它们的和。然后通过函数调用add(3, 5)计算结果,并将结果赋给result2,最后输出结果。

小结

表达式和语句是Objective - C编程的基础。表达式用于计算值,而语句用于执行操作和控制程序流程。深入理解各种表达式和语句的特性、用法以及它们之间的相互关系,对于编写高效、健壮的Objective - C程序至关重要。通过灵活运用不同类型的表达式和语句,可以实现复杂的业务逻辑和算法,满足各种编程需求。在实际编程中,需要根据具体情况选择合适的表达式和语句,以提高代码的可读性、可维护性和性能。同时,要注意表达式的优先级和结合性,以及语句的作用域和执行顺序,避免出现逻辑错误。通过不断练习和实践,开发者能够更加熟练地掌握Objective - C的表达式和语句,提升编程能力。