Sel*_*enç 0 c++ pointers operators operator-precedence
我试图理解括号如何影响表达式中的优先级:
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto b = arr;
std::cout << *(++b) << std::endl;
// output : 1
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我得到了预期的输出,但如果我将其更改为:
std::cout << *(b++) << std::endl;
// output 0
Run Code Online (Sandbox Code Playgroud)
我得到0了输出.由于括号我b++将首先进行评估,然后进行解引用.看来我错了,那么我完全去除括号和测试与*++b和*b++并获得意味着括号并不影响这种表达的优先级相同results.Does?为什么这两个表达式的结果是等价的:
*(b + 1)
*(++b)
Run Code Online (Sandbox Code Playgroud)
但事实并非如此*(b++)?
小智 7
它确实评估了b++第一个.b++递增b并返回以前的值b,前增量发生.结果b++和b之后的价值是不同的.把它想象成(使用int而不是int *因为引用指针使签名变得丑陋):
int postfix_increment(int &x) {
int result = x;
x = x + 1;
return result;
}
Run Code Online (Sandbox Code Playgroud)
(除了在下一个序列点之前使用递增的值是未定义的行为.)
如果为括号的结果引入临时变量,为了确保首先评估它,可能更容易看到差异:
int *tmp = b++;
// At this point, b == tmp + 1!
std::cout << *tmp << std::endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |