一文读懂Objective-C的表达式与语句
表达式基础
在Objective - C中,表达式是由操作数(operand)和运算符(operator)组成的。操作数可以是常量、变量、函数调用等,而运算符则用于对操作数进行各种操作。表达式会产生一个值,这个值的类型取决于表达式中操作数和运算符的类型。
算术表达式
- 基本算术运算符
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);
在上述代码中,首先定义了两个整数变量num1
和num2
,然后分别进行了加、减、乘、除和取模运算,并使用NSLog
函数输出结果。需要注意的是,在整数除法中,结果会截断小数部分。
- 自增和自减运算符
自增(
++
)和自减(--
)运算符用于将变量的值增加或减少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);
在这个代码示例中,展示了自增和自减运算符的前缀和后缀形式的不同行为。前缀形式先对变量进行自增或自减操作,然后使用新的值;后缀形式则先使用变量原来的值,然后再进行自增或自减操作。
关系表达式
关系表达式用于比较两个操作数的大小关系,其结果是一个布尔值(YES
或NO
)。常见的关系运算符有大于(>
)、小于(<
)、大于等于(>=
)、小于等于(<=
)、等于(==
)和不等于(!=
)。
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");
上述代码通过比较num3
和num4
的值,使用不同的关系运算符得到相应的布尔结果,并使用NSLog
函数输出。这里使用了条件运算符(? :
)来将布尔值转换为字符串输出。
逻辑表达式
逻辑表达式用于组合多个关系表达式或其他逻辑表达式,以形成更复杂的条件判断。Objective - C提供了逻辑与(&&
)、逻辑或(||
)和逻辑非(!
)运算符。
- 逻辑与(
&&
) 只有当两个操作数都为YES
时,逻辑与表达式的结果才为YES
,否则为NO
。
BOOL condition1 = YES;
BOOL condition2 = NO;
BOOL resultAnd = condition1 && condition2;
NSLog(@"逻辑与结果: %@", resultAnd? @"YES" : @"NO");
在这个例子中,condition1
为YES
,condition2
为NO
,所以resultAnd
为NO
。
- 逻辑或(
||
) 只要两个操作数中有一个为YES
,逻辑或表达式的结果就为YES
,只有当两个操作数都为NO
时,结果才为NO
。
BOOL condition3 = YES;
BOOL condition4 = NO;
BOOL resultOr = condition3 || condition4;
NSLog(@"逻辑或结果: %@", resultOr? @"YES" : @"NO");
这里condition3
为YES
,所以resultOr
为YES
。
- 逻辑非(
!
) 逻辑非运算符用于对一个布尔值取反,即如果操作数为YES
,则结果为NO
;如果操作数为NO
,则结果为YES
。
BOOL condition5 = YES;
BOOL resultNot =!condition5;
NSLog(@"逻辑非结果: %@", resultNot? @"YES" : @"NO");
由于condition5
为YES
,经过逻辑非运算后,resultNot
为NO
。
赋值表达式
赋值表达式用于将一个值赋给一个变量。在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
。如果condition
为YES
,则返回expression1
的值;否则返回expression2
的值。
int num7 = 10;
int num8 = 5;
int max = num7 > num8? num7 : num8;
NSLog(@"较大值: %d", max);
在这个例子中,通过条件表达式比较num7
和num8
的大小,将较大的值赋给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
循环中,循环体为空语句,循环仅仅是让i
从0
递增到9
。
复合语句
复合语句(也称为块语句)是由一对花括号({}
)括起来的一组语句。复合语句在语法上被视为单个语句。
int x = 5;
int y = 3;
{
int sum = x + y;
NSLog(@"复合语句内的和: %d", sum);
}
// 这里不能访问sum变量,因为它的作用域仅限于复合语句内
在上述代码中,花括号内定义了一个新的变量sum
并计算了x
和y
的和,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);
}
在这个例子中,i
从0
开始,每次循环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语句
- break语句
break
语句用于立即终止循环或switch - case
语句。在循环中使用break
可以提前结束循环。
for (int j = 0; j < 10; j++) {
if (j == 5) {
break;
}
NSLog(@"j的值: %d", j);
}
在这个for
循环中,当j
等于5
时,执行break
语句,提前结束循环,所以只会输出j
从0
到4
的值。
- 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的表达式和语句,提升编程能力。