.操作符和->操作符的区别
时间: 2023-09-28 21:05:42 浏览: 83
`.`操作符和`->`操作符都是用来访问结构体或类的成员变量或成员函数的。它们的区别在于:
`.`操作符用于访问结构体或类的成员变量或成员函数,左边的操作数必须是一个结构体或类的实例。例如,`data.x`表示访问`data`实例中的`x`成员变量。
`->`操作符用于访问结构体或类的成员变量或成员函数,左边的操作数必须是一个指向结构体或类的指针。例如,`ptr->x`表示访问指针`ptr`所指向的结构体或类实例中的`x`成员变量。
所以,当我们使用指针来访问结构体或类的成员时,必须使用`->`操作符;当我们使用结构体或类的实例来访问其成员时,必须使用`.`操作符。
相关问题
attitude.roll和attitude->roll有什么区别
attitude.roll 和 attitude->roll 都是用于访问结构体中的 roll 属性的,不同点在于前者是使用点符号操作符来访问 roll 属性,而后者是使用指针符号操作符来访问 roll 属性。
如果 attitude 是一个结构体变量,那么使用点符号操作符来访问其属性比较方便。例如:
```
struct Attitude {
float roll;
float pitch;
float yaw;
};
Attitude myAttitude;
// 设置 roll 属性
myAttitude.roll = 0.5;
// 访问 roll 属性
float rollValue = myAttitude.roll;
```
如果 attitude 是一个指向结构体的指针,那么使用指针符号操作符来访问其属性比较方便。例如:
```
struct Attitude {
float roll;
float pitch;
float yaw;
};
Attitude* myAttitudePtr = new Attitude();
// 设置 roll 属性
myAttitudePtr->roll = 0.5;
// 访问 roll 属性
float rollValue = myAttitudePtr->roll;
```
在以上示例中,myAttitude.roll 和 myAttitudePtr->roll 都是访问 Attitude 结构体中的 roll 属性,但是使用指针符号操作符更加方便,因为我们不需要先解引用指针再使用点符号操作符来访问属性。
/* 0. S->E */ /* 1. E->E+T */ /* 2. E->T */ /* 3. T->T*P */ /* 4. T->P */ /* 5. P->i */ /* 6. P->(E) */写出基于表的LL(1)分析程序
基于表的LL(1)分析程序是一种语法分析方法,用于根据给定的文法和输入串来构建语法树。它使用一个预测分析表来指导分析过程。下面是一个基于表的LL(1)分析程序的示例:
```python
# 定义预测分析表
# 行表示非终结符,列表示终结符
# M[A, a]表示在非终结符A和终结符a的情况下,应该采取的产生式
M = {
'S': {'i': 0, '(': 0},
'E': {'i': 1, '(': 1},
'T': {'i': 2, '(': 2},
'P': {'i': 5, '(': 6, ')': -1, '+': -1, '*': -1, '$': -1}
}
# 输入串
input_str = 'i+i*i$'
# 分析栈
stack = ['$']
# 输入串指针
input_ptr = 0
# 开始符号
start_symbol = 'S'
# 将开始符号入栈
stack.append(start_symbol)
# 分析过程
while True:
# 栈顶符号
top = stack[-1]
# 输入串当前字符
current_char = input_str[input_ptr]
if top == '$' and current_char == '$':
# 分析成功
print('分析成功')
break
elif top in M and current_char in M[top]:
# 根据预测分析表进行相应操作
production = M[top][current_char]
if production == -1:
# 错误处理
print('语法错误')
break
else:
# 弹出栈顶符号
stack.pop()
# 将产生式右部逆序入栈
for symbol in reversed(production):
stack.append(symbol)
elif top == current_char:
# 匹配成功,弹出栈顶符号和输入串指针后移
stack.pop()
input_ptr += 1
else:
# 错误处理
print('语法错误')
break
```