目录文章:C++中运算符的优先级
函数调用运算符: ()
在函数名后面,通常要加上函数调用运算符,就是括号,表示调用。括号是唯一一个在重载时参数数目可变的运算符。
有一种情况,函数名后面不用加括号…………相信大家都猜到了,那就是函数指针。函数指针的定义方法如下:
返回值类型 (*函数指针名)(函数参数类型表); //函数参数类型表是像这样的:int,double,char,int...
你想定义一个让一个月后的自己和别人都看不懂的类型吗?你可以参考这个:
unsigned long long int*****(*name)(int**(*)(double***(*)(long double*,unsigned),char****),long long*(*)(decltype(new int),unsigned short**(*)(),bool,char**(*)(char**(*)(char,unsigned char(*)(void)))));
我想谁都看不懂这个类型,这样,我加上换行和注释,再写一遍:
unsigned long long int***** // 返回类型
(*name) // 函数指针名
( // 函数参数类型表的开头
int**(*)(double***(*)(long double*,unsigned),char****), // 第一个参数
long long*(*)( // 第二个参数
decltype(new int), // 1.参数(C++11)
unsigned short**(*)(), // 2.参数
bool, // 3.参数
char**(*)(char**(*)(char,unsigned char(*)(void))) // 4.参数
) // 第二个参数的结尾
); // 函数参数类型表的结尾
我解释一下(注意缩进):
这是一个名为name,指向一个返回值为unsigned long long int*****(五级指针)、参数为……(暂时省略,下同)的函数。
函数的第一个参数是一个指向返回值为int**、参数为……的函数,
这个函数的第一个参数为一个指向返回值为double***、参数分别是 long double* 和 unsigned ,
这个函数的第二个参数为char****(四级指针);
函数的第二个参数是一个指向返回值为long long*、参数为……的函数,
这个函数的第一个参数是decltype(new int),也就是int*,(请自行搜索decltype,这是C++11的关键字)
这个函数的第二个参数是一个指向返回值为unsigned short、没有参数的函数,
这个函数的第三个参数是bool,
这个函数的第四个参数是一个指向返回值为char**、参数是……的函数,
它的第一个参数是一个指向返回值为char**、参数是……的函数,
它的第一个参数是char,
它的第二个参数是一个指向返回值为unsigned char、参数是void(没有参数)的函数。
有趣的是,这里还不够复杂,函数指针也是可以多重的,比如下面的一行代码:
int (***fppp)(char(*****)());
可以从中看到,多重函数指针就是把第一个括号里的星号数量增多,有几个就是几级。
下标访问运算符: []
说是下标访问,实际上并不一定要用数组名,指针名也可以。比如下面代码:
#include<iostream>
using namespace std;
int main(){
int a[100];
for(int i=0;i<100;i++) a[i]=i; //使用数组名的下标访问
int* p=a+50; //或&a[50] //定义p为a数组中间的元素
for(int i=-50;i<50;i++) cout<<p[i]<<' '; //使用指针名的下标访问,虽然是负数却没有下标越界
return 0;
}
结果:0 1 2 3 4 5 6 ... 97 98 99
这给合理的负数下标提供了可能,也简化了一些问题(比如从-100开始枚举到100)。
实际上,下标访问运算符就是这样的:(很像C++的伪代码)
template<typename T>
T& operator [] (T* pointer,int subscript){ //这里是不合法的,编译器会提示应该只有一个参数
return *(pointer+subscript);
}
而指针的加法实际上就是向后移 sizeof(T) 字节。
欢迎转载,但请在文章中附加上本文链接: https://blog.csdn.net/weixin_41461277/article/details/85329838 。