gpt4 book ai didi

c - C中表达式的指针和右评估

转载 作者:太空狗 更新时间:2023-10-29 15:30:41 25 4
gpt4 key购买 nike

我有一个关于 C 语言的问题。请考虑以下代码(这是一个最小示例):

#include <stdio.h>

int f(int**, int*);

int main(int argc, char *argv[])
{
int *u = NULL, t1=0, t2=1;

u = &t1;
printf("t1 : %d\n", t1);
printf("t2 : %d\n\n", t2);

*u = 36;
printf("t1 : %d\n", t1);
printf("t2 : %d\n\n", t2);

*u = f(&u, &t2);
printf("t1 : %d\n", t1);
printf("t2 : %d\n\n", t2);

return 0;
}

int f(int** p, int* e){
*p = e;
return 24;
}

当我运行这个程序时,我得到以下结果:

t1 : 0
t2 : 1

t1 : 36
t2 : 1

t1 : 24
t2 : 1

令我惊讶的是表达式的左边部分(即 *u):

*u = f(&u, &t2);

在函数 f 处理之前是固定的。事实上,我期待以下结果,因为函数 f 修改了指针 u :

t1 : 0
t2 : 1

t1 : 36
t2 : 1

t1 : 36
t2 : 24

这正常吗?我在 C 课上漏掉了什么吗?

最佳答案

赋值表达式中没有序列点,赋值表达式左右操作数之间的求值顺序也没有保证。您编写的代码在 C 中没有明确定义的行为,因此您看到的行为并不意味着您的编译器不符合要求。

6.5/3:

Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.

虽然函数调用有顺序点,但无法保证函数是在*u求值之前还是之后调用。

关于c - C中表达式的指针和右评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com