c++ - C++:来自 Stroustrup 示例的运算符优先级
问题描述
Stroustrup C++ 第 4 版第 197 页包含以下示例,这些示例导致打印的字符流递增,直到null
和 not "abc"
。问题:如何++*p
评估? ++
并且*
是相同的优先级和从右到左的评估,因此我的理解*p
是首先评估,导致字符p
指向,然后这个字符增加++
. 这种理解正确吗?谢谢
#include <iostream>
using namespace std;
void fp(char* p)
{
while (*p)
cout << ++*p;
}
void fr2(char& r)
{
char* p = &r;
while (*p)
cout << ++*p;
}
int main(int argc, char *argv[])
{
char s[] = "abc";
char *p = s;
fp(p);
fr2(*p);
return 0;
}
解决方案
是的,您对优先级和关联性的看法是正确的。这个表达式:
++*p;
被解析为
++(*p);
即首先间接p
完成,然后返回的值递增。
这意味着在 while 循环中:
while (*p)
cout << ++*p;
指针p
实际上从未递增。这会导致一个无限循环,其中只有 的值p[0]
永远递增。
这是一个演示,它将输出显示为一个很长的 ascii 值序列,从a
. 注意abc
不打印。
同理,表达式:
*++p;
被解析为:
*(++p);
这很好,因为指针首先递增,然后指针被取消引用。
推荐阅读
- python - 如何在 python 中使用 % 方法和条件运算符?
- android - 使用 Andoid 平台时 Unity Tilemap 被挤压
- amazon-web-services - 亚马逊云与其CDN(内容分发网络)的区别
- python - sklearn;模型拟合前后超参数值相同
- java - 为什么我的队列列表在 java 中不能作为 FIFO 工作?
- excel - 如何在excel VBA中使用多个列值验证列
- java - 尝试使用双打和 Math.sqrt 进行计算,但只得到 0
- c++ - 无法使用 Nlohmann 的 JSON 在自身内部获取对象向量
- ffmpeg - 如何裁剪然后缩放视频ffmpeg
- python - 两个列表的乘积之和