c - 程序输出说明

谁能解释为什么这个程序打印 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

https://stackoverflow.com/questions/66049397/

相关文章:

swift - SwiftLint 的开关大小写格式问题

powershell - 如何在 Powershell 中对 3000 万条 csv 记录进行排序

flutter - 具有动态高度的动画容器 Flutter

javascript - 使用路由器 "No overload matches this call"

java - 如果有 happens-before 保证,让 "this"在构造函数的最后一个语句中

flutter - 调用者没有执行指定操作的权限

python - 将 seq2seq NLP 模型转换为 ONNX 格式会对其性能产生负面影响吗?

c# - 如何使用 C# 连接到 Azure 存储表

c++ - 为什么 std::ranges::view_interface 使用 CRTP

list - 从列表中获取元素 Terraform