解释int a=9;printf("%d,%d",a,a++)?输出情况

结论取自知乎前辈:

任何在同一个表达式内多次使用++/--的C语言题目都无助于你学习C语言。

这种行为是未定义的行为,换句话说,结果是多少是不确定的。不要过分去研究这类题目,没有意义。同时正确的代码里也不应该有这种不确定结果的表达式出现,在项目代码里,一般来说都严格禁止这样使用。

下面解释原因:

首先,printf的入栈顺序是从右到左,任何一个标准库的printf都是这样的,否则printf无法在栈顶取到最左边的第一个参数。

那么,你的这个题目的一种可能的运行状态是:

1. 取a的值,入栈(右边第一个参数),此时a的值是9;
2. 给a执行++操作;
3. 取a的值,入栈(右边第二个参数),此时a的值是10;
4. 参数"%d,%d"(指针),入栈;
5. 调用printf

所以输出的结果就是10,9

但以上只是一种可能的运行状态。

也可能是下面这种:

1. 取a的值,入栈(右边第一个参数);
2. 取a的值,入栈(右边第二个参数);
3. 参数"%d,%d"(指针),入栈;
4. 给a执行++操作;
5. 调用printf

因为编译器可能优化代码,如果是这种情况,那么输出结果就是9,9

因为C标准里没有规定具体++执行的时间点在哪,所以这种问题没有标准答案。

再说一句,实际项目工程代码里,禁止用这种有歧义的写法。
时间: 2024-08-10 00:04:04

解释int a=9;printf("%d,%d",a,a++)?输出情况的相关文章

下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf("%d,%d",(x++,y),y++);

下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf("%d,%d",(x++,y),y++); 输出结果为A  (y++优先级比较高,所以先计算y++,再计算()里面的内容) 原文地址:https://www.cnblogs.com/dyb-tsyyl/p/10108933.html

64位int遇上printf

刚调试一个项目,配置好参数,运行,一会儿在printf语句处出了异常.仔细一想感觉好奇怪,printf又没有什么数组越界,怎么会出这个问题.后经大神指点,是否有64位的int什么的,仔细一排查,果真有,先写下来备忘吧. vs 支持 long long 和 __int64 定义的64位整形,输出的时候要特别注意printf里面要%I64d 或者 %lld !

int a[5]={1,2,3,4,5}; int *p=(int*)(&a+1); printf("%d",*(p-1)); 答案为什么是5?

这个问题的关键是理解 &a a是一个数组名,也就是数组的首地址.对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!也就相当于int (*p) [5] = &a;p是一个指针,它指向的是一个包含5个int元素的数组!! 那么执行p+1后,p的偏移量相当于 p + sizeof(int) * 5 !! 而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int)所以,p -1 指向了数组中得最后一个元素,也就是 5

C 语言中的printf()多参数输出问题

问题: x=1; y=2; printf("%d",x+y,x++,y++); 输出结果为什么是5? 首先解释一点,x+y,x++,y++是逗号表达式,逗号表达式的结果是最后一个表达式的结果. 但是在这里printf()函数是从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的. 读取入栈:                                                           处理计算:  

printf("%f\n",5)的输出结果为什么是0.000000

1,之所以没输出5,这是C语言设计的原因.2,之所以输出0,这是计算机体系结构的问题. 具体来说: printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式).C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存.这点就和huhugo88所说一样,5在内存中为00000000,00000101.而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就

unsigned short A = 10; printf("~A = %u\n", ~A); char c=128; printf("c=%d\n",c); 输出多少?

这是题目给出的答案:第一题,-A =0xfffffff5,int值 为-11,但输出的是uint.所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128.这两道题都是在考察二进制向int或uint转换时的最高位处理. 我不明白为什么-A =0xfffffff5,还有为什么c=0x10,不应该是c=0x08吗,不好意思各位大侠,小弟的分数用完了.谢谢回答 2^32=4294967296, A=10,为无符号型

经典c语言题

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个. #define MIN(A,B) ((A) <= (B) ?(A) : (B)) 5. 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer)

C语言面试及答案分析

第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多

C语言经典面试题目(转的,不过写的的确好!)

第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多