零基础学OC:变量与基本数据类型(C++开发者速通版)[特殊字符]

零基础学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%相同

  • 只能用字母、数字、下划线,不能以数字开头
  • 大小写敏感(Ageage是两个不同变量)
  • 不能用关键字(intifclass等)
  • 行业通用:小驼峰命名法(userNametotalPrice

二、基本数据类型:你要开多大的房间?📏

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类型,只有truefalse两个值,不会有这个问题:

cpp 复制代码
bool isSuccess = 2; // 会自动转换为true
if (isSuccess == true) {
    cout << "成功" << endl; // 正常执行
}

三、数据类型转换:换个房间住🚪

和C++的转换规则完全一样,分为自动转换和强制转换两种。

3.1 自动转换(隐式转换)

规则 :小类型自动转大类型,不会丢数据

转换顺序:charintfloatdouble

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个坑💣

  1. 变量未初始化就用

    objc 复制代码
    int score;
    NSLog(@"%d", score); // 输出随机垃圾值
  2. 整数溢出

    objc 复制代码
    int max = 2147483647;
    int overflow = max + 1;
    NSLog(@"%d", overflow); // 输出-2147483648(变成负数了!)
  3. float忘加f后缀

    objc 复制代码
    float x = 3.14; // 警告:把double转成float可能丢精度
    float y = 3.14f; // 正确
  4. 字符和字符串搞混

    objc 复制代码
    char c = "A"; // 错误!"A"是字符串,应该用单引号'A'
    char c = 'A'; // 正确
  5. BOOL和YES比较

    objc 复制代码
    if (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++里的intstd::any的关系,或者int和自己写的Number类的关系。

总结✨

今天咱们把OC的变量和基本数据类型过了一遍,核心要点就三个:

  1. 90%的语法和C++完全一样,直接照搬就行
  2. 唯一的大坑是BOOL类型,永远不要写if (x == YES)
  3. 浮点精度问题用NSDecimalNumber解决

下一篇咱们继续讲常量、枚举和typedef,这些也都是和C++高度相似的内容,学起来会非常快!

相关推荐
bjzhang7511 小时前
python开发环境安装及30个常用第三方库
开发语言·python
狼与自由11 小时前
jdk版本升级
java·开发语言
SoftLipaRZC11 小时前
C语言字符完全指南:字符函数与字符串函数
c语言·开发语言·算法
云姜.11 小时前
Langchain快速上手编程-Runnable 与 LCEL
java·开发语言·langchain
折哥的程序人生 · 物流技术专研11 小时前
《Java 100 天进阶之路》第40篇:浮点数转成十进制问题
java·开发语言·后端·面试·求职招聘
zhendianluli11 小时前
在 RTX 4090 + Python 3.10 上成功安装 Mamba‑3 的避坑指南
开发语言·python
人还是要有梦想的11 小时前
Qt WebEngine需要MSVC进行编译运行,QT如何用MSVC编译(包含64位和32位)
开发语言·qt·msvc
xxl大卡11 小时前
Redis 主从复制与哨兵模式
java·开发语言
嗝o゚11 小时前
CANN pyasc 工具——Python 接口的算子开发
开发语言·python·cann·pyasc