gpt4 book ai didi

c - 程序输出说明

转载 作者:行者123 更新时间:2023-12-05 08:37:14 27 4
gpt4 key购买 nike

谁能解释为什么这个程序打印 4 1 而不是 4 2?

是不是应该先执行优先级高的pre increment运算符打印4 2?

#include <stdio.h>
int main() {
int a=1;
printf ("%ld %d",sizeof(++a),a);
return 0;
}

最佳答案

虽然你已经得到了几个答案,但我想再提供一个,因为你的问题实际上包含三个不同的误解,我想一一触及。

首先,sizeof 是一个特殊的运算符,根据定义,它 计算它的参数(即,它取大小的任何子表达式)。所以 sizeof(++a) 不会增加 asizeof(x = 5) 不会将 5 赋值给 x。而 sizeof(printf("Hello!"))打印“Hello”。

其次,如果我们去掉 sizeof,只写

printf("%d %d", ++a, a);

我们能够使用优先级来找出行为。优先级是一个重要的概念,但通常它不会帮助您弄清楚涉及 ++ 的混淆操作的行为。

最后,也许令人惊讶的答案是,如果你写

printf("%d %d", ++a, a);

根本不可能弄清楚它会做什么。它基本上是未定义的。 (特别是:在像 printf("%d %d", x, y) 这样的任何函数调用中,未指定参数的计算顺序,所以你不需要知道 xy 是否首先被评估——尽管有一个顺序。但是,当其中一个是 a 并且其中一个是是 ++a,您会遇到 a 既被修改又被使用的情况,因此无法知道使用的是旧值还是新值,这使得表达式未定义。有关此问题的更多信息,请参阅 this question。)

附言还有一个问题我忘了提,正如来自莫斯科的@Vlad 所指出的:%ld 不是打印 sizeof 结果的可靠方法,它是类型的值大小_t。如果可以,您应该使用 %zu,如果不能,则在转换为 (unsigned) 后使用 %u

关于c - 程序输出说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66049397/

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