对C中的增量运算符感到困惑
Confused about increment operator in C
我用 C 语言编写了一个程序来使用数组创建基本堆栈。它按预期工作,但有些事情我很困惑。在 push 方法的第一行,我增加了 *top_ptr 的值,这是一个指向变量 top 的指针,使用语法
*top_ptr = *top_ptr+1
。当我尝试用 *top_ptr++
替换这一行时,我认为它更简洁并且意思相同,我收到一条警告,指出 Wunused 变量,并且在 运行 宁它时出现分段错误。来自我的终端的警告信息逐字逐句地是
warning: expression result unused [-Wunused-value]
*top_ptr++;
^~~~~~~~~~
我从终端收到的确切错误消息是:
zsh: segmentation fault ./stacks/arrayi
当我运行程序与当前程序时,我的输出是我期望的:1 2 3 %
我的代码如下。再一次,我感到困惑的是 push 方法的第一行,即第 17 行。如果您回答了这个问题,那么感谢您的时间和考虑。
#include <stdio.h>
#define MAX_SIZE 101
void push(int *, int *, int);
void print(int *, int *);
int main() {
int top = -1;
int *top_ptr = ⊤
int arr[MAX_SIZE];
push(arr, top_ptr, 1);
push(arr, top_ptr, 2);
push(arr, top_ptr, 3);
print(arr, top_ptr);
}
void push(int *array, int *top_ptr, int x) {
*top_ptr = *top_ptr + 1;
array[*top_ptr] = x;
}
void print(int *array, int *top_ptr) {
for (int i = 0; i <= *top_ptr; i++) {
printf("%d ", array[i]);
}
}
*top_ptr++
是*(top_ptr++)
,这是错误的,因为它改变了top_ptr
,这不是你想要做的。
你想要(*top_ptr)++
.
编译器警告您表达式结果未使用,因为在 (top_ptr++)
之后,*
获取 (top_ptr++)
指向的值,但没有对该值执行任何操作。这是可疑的,因此编译器会警告您,您已告诉它获取一个值但不对其执行任何操作。
相比之下,使用 (*top_ptr)++
,它不会警告您,因为 ++
修改了 (*top_ptr)
指向的内容,因此表达式以有用的操作结束。
你应该做的
(*top_ptr)++;
那个括号很重要。如果你不给括号那么基本上它会像
一样执行
*(top_ptr++);
即首先指针 top_ptr 将递增,然后它会被推迟。这就是为什么它给你分段错误。
(并且top_ptr指向的值不会递增)
我用 C 语言编写了一个程序来使用数组创建基本堆栈。它按预期工作,但有些事情我很困惑。在 push 方法的第一行,我增加了 *top_ptr 的值,这是一个指向变量 top 的指针,使用语法
*top_ptr = *top_ptr+1
。当我尝试用 *top_ptr++
替换这一行时,我认为它更简洁并且意思相同,我收到一条警告,指出 Wunused 变量,并且在 运行 宁它时出现分段错误。来自我的终端的警告信息逐字逐句地是
warning: expression result unused [-Wunused-value]
*top_ptr++;
^~~~~~~~~~
我从终端收到的确切错误消息是:
zsh: segmentation fault ./stacks/arrayi
当我运行程序与当前程序时,我的输出是我期望的:1 2 3 %
我的代码如下。再一次,我感到困惑的是 push 方法的第一行,即第 17 行。如果您回答了这个问题,那么感谢您的时间和考虑。
#include <stdio.h>
#define MAX_SIZE 101
void push(int *, int *, int);
void print(int *, int *);
int main() {
int top = -1;
int *top_ptr = ⊤
int arr[MAX_SIZE];
push(arr, top_ptr, 1);
push(arr, top_ptr, 2);
push(arr, top_ptr, 3);
print(arr, top_ptr);
}
void push(int *array, int *top_ptr, int x) {
*top_ptr = *top_ptr + 1;
array[*top_ptr] = x;
}
void print(int *array, int *top_ptr) {
for (int i = 0; i <= *top_ptr; i++) {
printf("%d ", array[i]);
}
}
*top_ptr++
是*(top_ptr++)
,这是错误的,因为它改变了top_ptr
,这不是你想要做的。
你想要(*top_ptr)++
.
编译器警告您表达式结果未使用,因为在 (top_ptr++)
之后,*
获取 (top_ptr++)
指向的值,但没有对该值执行任何操作。这是可疑的,因此编译器会警告您,您已告诉它获取一个值但不对其执行任何操作。
相比之下,使用 (*top_ptr)++
,它不会警告您,因为 ++
修改了 (*top_ptr)
指向的内容,因此表达式以有用的操作结束。
你应该做的
(*top_ptr)++;
那个括号很重要。如果你不给括号那么基本上它会像
一样执行*(top_ptr++);
即首先指针 top_ptr 将递增,然后它会被推迟。这就是为什么它给你分段错误。
(并且top_ptr指向的值不会递增)