零基础学OC:变量与基本数据类型(C++开发者速通版)👋
大家好!今天咱们来啃OC最基础也最容易踩坑的一块------变量和基本数据类型。如果你有C++基础,那恭喜你,OC这部分90%的语法你都已经会了!剩下10%的差异,正是咱们今天要重点揪出来的坑🕳️
一、变量:给内存房间贴个门牌号🏠
1.1 变量到底是什么?
通俗理解:内存就像一个超大的酒店,每个字节是一个房间。变量就是你给某几个连续房间起的名字,以后找数据直接喊名字就行,不用记复杂的房间号(内存地址)。
C++类比:和C++完全一样!OC是C的超集,变量的底层逻辑和C/C++没有任何区别。
1.2 变量的声明与初始化
✅ OC代码
objc
// 方式1:先声明后赋值(不推荐,容易忘)
int age;
age = 22;
// 方式2:声明同时初始化(强烈推荐)
int height = 178;
// 方式3:连续声明多个变量
int a = 10, b = 20, c;
c = a + b;
🆚 C++对比代码
cpp
// 完全一模一样!
int age;
age = 22;
int height = 178;
int a = 10, b = 20, c;
c = a + b;
💡 注意:和C++一样,未初始化的变量会存着内存里的"垃圾值",直接用会出玄学Bug!编译器会给你黄色警告,一定要全部消除!
1.3 变量命名规则
和C++的命名规则100%相同:
- 只能用字母、数字、下划线,不能以数字开头
- 大小写敏感(
Age和age是两个不同变量) - 不能用关键字(
int、if、class等) - 行业通用:小驼峰命名法(
userName、totalPrice)
二、基本数据类型:你要开多大的房间?📏
OC的基本数据类型和C++几乎完全一致,都是直接存在栈上,速度飞快。下面是64位系统下的完整对比表:
| OC类型 | 占用字节 | 取值范围 | C++对应类型 | 用途 |
|---|---|---|---|---|
int |
4 | -2147483648 ~ 2147483647 | int |
存整数(年龄、数量、循环次数) |
float |
4 | ±3.4e-38 ~ ±3.4e38 | float |
存低精度小数(坐标、进度) |
double |
8 | ±1.7e-308 ~ ±1.7e308 | double |
存高精度小数(价格、计算结果) |
char |
1 | -128 ~ 127 | char |
存单个字符或ASCII码 |
2.1 整数类型 int
✅ OC代码
objc
// 定义整数变量
int studentCount = 50;
int maxScore = 100;
// 整数运算
int sum = 90 + 85;
int remainder = 10 % 3; // 取余,结果是1
🆚 C++对比代码
cpp
int studentCount = 50;
int maxScore = 100;
int sum = 90 + 85;
int remainder = 10 % 3;
2.2 浮点类型 float 和 double
✅ OC代码
objc
// float必须加f后缀!否则默认是double
float pi = 3.14159f;
double gravity = 9.8;
// 浮点运算
double area = pi * 2 * 2;
🆚 C++对比代码
cpp
float pi = 3.14159f;
double gravity = 9.8;
double area = pi * 2 * 2;
2.3 字符类型 char
✅ OC代码
objc
// 字符用单引号
char grade = 'A';
char newline = '\n';
// char本质是整数,可以直接运算
char nextGrade = grade + 1; // 结果是'B'
🆚 C++对比代码
cpp
char grade = 'A';
char newline = '\n';
char nextGrade = grade + 1;
2.4 重点!BOOL类型(OC和C++最大的区别⚠️)
这是OC最坑人的地方!OC没有真正的布尔类型,它的BOOL是伪装的!
✅ OC底层定义
objc
// 惊不惊喜?BOOL其实是char的别名!
typedef signed char BOOL;
#define YES (BOOL)1
#define NO (BOOL)0
❌ 错误写法(90%的新手都踩过)
objc
BOOL isSuccess = 2; // 非0值在if里是真,但不等于YES(1)
if (isSuccess == YES) {
NSLog(@"成功"); // 永远不会执行!
}
✅ 正确写法
objc
BOOL isSuccess = 2;
if (isSuccess) { // 直接判断,不要和YES比较
NSLog(@"成功"); // 正常执行
}
🆚 C++对比
C++有真正的bool类型,只有true和false两个值,不会有这个问题:
cpp
bool isSuccess = 2; // 会自动转换为true
if (isSuccess == true) {
cout << "成功" << endl; // 正常执行
}
三、数据类型转换:换个房间住🚪
和C++的转换规则完全一样,分为自动转换和强制转换两种。
3.1 自动转换(隐式转换)
规则 :小类型自动转大类型,不会丢数据
转换顺序:char → int → float → double
✅ OC代码
objc
int a = 10;
double b = 3.14;
double result = a + b; // a自动转成double再运算
NSLog(@"结果:%f", result); // 输出13.140000
🆚 C++对比代码
cpp
int a = 10;
double b = 3.14;
double result = a + b;
cout << "结果:" << result << endl;
3.2 强制转换(显式转换)
规则:大类型转小类型需要手动强制,可能丢数据
✅ OC代码
objc
double pi = 3.1415926;
int intPi = (int)pi; // 小数部分被砍掉,结果是3
NSLog(@"整数π:%d", intPi);
🆚 C++对比代码
cpp
double pi = 3.1415926;
int intPi = (int)pi;
cout << "整数π:" << intPi << endl;
3.3 经典坑:0.1 + 0.2 ≠ 0.3 😱
所有编程语言都有这个问题!因为计算机用二进制存小数,0.1和0.2无法精确表示。
✅ OC代码演示
objc
double sum = 0.1 + 0.2;
NSLog(@"0.1 + 0.2 = %.17f", sum); // 输出0.30000000000000004
✅ 解决方案(金融场景必看)
objc
// 用NSDecimalNumber做精确计算
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"0.1"];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"0.2"];
NSDecimalNumber *result = [num1 decimalNumberByAdding:num2];
NSLog(@"精确结果:%@", result); // 输出0.3
四、新手必踩的5个坑💣
-
变量未初始化就用
objcint score; NSLog(@"%d", score); // 输出随机垃圾值 -
整数溢出
objcint max = 2147483647; int overflow = max + 1; NSLog(@"%d", overflow); // 输出-2147483648(变成负数了!) -
float忘加f后缀
objcfloat x = 3.14; // 警告:把double转成float可能丢精度 float y = 3.14f; // 正确 -
字符和字符串搞混
objcchar c = "A"; // 错误!"A"是字符串,应该用单引号'A' char c = 'A'; // 正确 -
BOOL和YES比较
objcif (isLogin == YES) {} // 错误! if (isLogin) {} // 正确
五、进阶小知识:基本类型 vs 对象类型🤔
有C++基础的同学肯定会问:OC里为什么既有int又有NSNumber?
- 基本类型(int、float等):存在栈上,速度快,不能存数组/字典里
- 对象类型(NSNumber、NSString等):存在堆上,速度慢一点,但可以存数组/字典里,还能调用方法
✅ 装箱拆箱操作
objc
// 装箱:把基本类型转成对象类型
int age = 25;
NSNumber *ageObj = @(age); // 语法糖,超方便
// 拆箱:把对象类型转成基本类型
int newAge = [ageObj intValue];
🆚 C++类比 :就像C++里的int和std::any的关系,或者int和自己写的Number类的关系。
总结✨
今天咱们把OC的变量和基本数据类型过了一遍,核心要点就三个:
- 90%的语法和C++完全一样,直接照搬就行
- 唯一的大坑是BOOL类型,永远不要写
if (x == YES) - 浮点精度问题用
NSDecimalNumber解决
下一篇咱们继续讲常量、枚举和typedef,这些也都是和C++高度相似的内容,学起来会非常快!