`

C语言中的printf

    博客分类:
  • C
c 
阅读更多

#include<stdio.h>
void main()
{
 int i=8;
 printf(" %d\n %d\n %d\n %d\n %d\n %d\n",++i,--i,i++,i--,-i++,-i--);
}

#include<stdio.h>

void main()
{
 int i=8;
 printf("%d\n",++i);

 printf("%d\n",--i);

 printf("%d\n",i++);

 printf("%d\n",i--);

 printf("%d\n",-i++);

 printf("%d\n",-i--);

}

两者的区别

像这种问题应该与编译器有关,在vc环境下的结果是8788-8-8
因为,在vc下,printf函数中,右自增自减是无法实现的,也就是等于没有,可以看看反汇编的代码
0040D78F   mov         eax,dword ptr [ebp-4]
0040D792   neg         eax
0040D794   mov         dword ptr [ebp-8],eax
0040D797   mov         ecx,dword ptr [ebp-8]
0040D79A   push        ecx
这是最后一个参数的反汇编,因为在C语言中,参数的调用,是从右到左的参数压入堆栈,所以先压入的是最后一个I,由于用了负号,所以,最后一个是-8,从右到左第二个一样,也用了负号,所以也是-8依此第三个,没有加负号,所以是8,再依次,还是8,最后两个,也就是从左到右第一二个,从右到左第5 ,6个,开始有变化了,我可以给你反汇编的代码看看,他们是左自增(自减),也就是先自增再使用,所以从右到左第5个,是7,是由于它自减,你可以看看反汇编代码
0040D7BB   mov         edx,dword ptr [ebp-4]
0040D7BE   sub         edx,1
0040D7C1   mov         dword ptr [ebp-4],edx
0040D7C4   mov         eax,dword ptr [ebp-4]
0040D7C7   push        eax
可以看到,先是把i的值给了寄存器值是8,再减-1就是7了,再把值赋值给i,那个,[ebp-4]就是i的地址,压入堆栈的时候是7,再看看最后压入堆栈的,
0040D7C8   mov         ecx,dword ptr [ebp-4]
0040D7CB   add         ecx,1
0040D7CE   mov         dword ptr [ebp-4],ecx
0040D7D1   mov         edx,dword ptr [ebp-4]
0040D7D4   push        edx
开始,[ebp-4]由于开始已经是7了,所以,add 加1后,就是8了,再把8给,[ebp-4]所以,最后i的值还是8,压入堆栈的时候,edx是8,所以,依此排列下来,压入的顺序就是,
-8
-8
8
8
7
8
最后堆栈的特点你应该了解吧,先入的后出,也就是,从下面开始调出,
最后,就是
8788-8-8
看C看不懂的时候, 可以反汇编看下。

分享到:
评论

相关推荐

    C语言中printf格式

    C语言中printf格式详细介绍 在 C 语言中,printf 函数是一个非常重要的输出函数,它可以根据不同的格式化字符串来输出各种类型的数据。在本文中,我们将详细介绍 printf 函数的使用方法和格式化字符串的规定符。 ...

    C语言中printf函数的功能注解.pdf

    《C语言中printf函数的功能注解》 C语言是一门基础且强大的编程语言,其中的printf函数是进行输出操作的核心工具。本文详细阐述了printf函数的功能,并提供了在使用过程中应注意的事项,旨在帮助读者更准确、高效地...

    C语言中printf函数的功能注解

    ### C语言中printf函数的功能注解 #### 一、引言 在C语言编程中,基本的输入输出功能主要是通过调用标准库函数实现的。其中,`printf`函数是功能强大且常用的输出函数之一。本文将详细介绍`printf`函数的功能,并...

    C语言中printf的使用.zip_C语言_printf函数

    printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf(&quot;&lt;式样化字符串&gt;&quot;,&lt;参量表&gt;);

    C语言中printf函数的功能注解[收集].pdf

    在C语言中,`printf`函数是一个非常重要的输出函数,用于在控制台上打印各种类型的数据。这篇文章详细介绍了`printf`函数的功能以及使用时需要注意的事项,对于理解和掌握C语言的基本输入输出具有指导意义。 首先,...

    C语言中printf()缓冲问题详解

    C语言中printf()缓冲问题详解 C语言中printf()缓冲问题是指在使用printf()函数时,因为缓冲机制的存在,可能会出现输出结果的延迟或不确定性。本文将详细介绍C语言中printf()缓冲问题的相关知识,包括缓冲...

    C语言里printf函数完整用法

    C语言里printf函数格式控制符的完整格式 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符

    详解C语言中printf输出的相关函数

    C语言printf()函数:格式化输出函数 printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出...

    C语言实现Printf函数完整工程文件

    在C语言中,`printf`函数是用于格式化输出数据的标准库函数,它在`stdio.h`头文件中被定义。这个"C语言实现Printf函数完整工程文件"提供了一个自定义实现`printf`功能的机会,这有助于理解其内部工作原理,并可以...

    printf用法大全,C语言printf格式控制符一览表.docx

    ### C语言printf函数详解 #### 一、printf函数概述 `printf`函数是C语言中最常用的输出函数之一,用于向标准输出设备(通常是屏幕)输出指定格式的数据。它定义在`stdio.h`头文件中,因此在使用时需要包含此头文件...

    单片机C语言实现printf.pdf

    在单片机编程中,使用C语言的`printf`函数是一项基础且重要的技能,特别是在进行串口通信时。`printf`函数允许开发者以格式化的字符串输出数据,这对于调试和信息传递非常有用。在51单片机上实现`printf`功能,需要...

    郝斌-C语言大纲

    在郝斌老师的资料中提到的“输出十六进制格式,%x,或者%#X(大写的X)”,这是C语言中printf函数的一个重要应用实例。在C语言中,`printf`函数用于格式化输出字符串到标准输出设备(通常是屏幕)。其中,`%x`和`%#X...

    单片机编程技巧 ,C语言自创printf()串口格式输出,优势:适用于程序空间紧缺的单片机,占用资源空间远远小于系统自带

    “C语言”标签表明这个函数是基于C语言实现的,C语言在单片机编程中广泛使用,因为它提供了直接访问硬件的能力,且代码较为高效。“printf”标签直接指出了讨论的核心,即对`printf()`函数的改进。“单片机”标签则...

    printf用法_1.cpp

    C语言中printf的用法

    浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中。返回值是输出的字符数量。sprintf语法: #include &lt;stdio&gt;int sprintf( char *buffer, const char *format, … );sprintf()函数和...

    C语言教学中printf函数功能解析.pdf

    在C语言中,printf函数是一个非常重要的标准输入输出库函数,广泛用于程序的数据输出。它的作用是根据给定的格式控制字符串,将输出表列中指定的数据输出到显示器或其他指定的输出设备。printf函数属于C语言标准库中...

    printf函数的原型和重定义

    printf 函数是 C 语言中一个常用的输出函数,它可以将格式化的字符串输出到标准输出设备上。在嵌入式开发领域中,printf 函数经常被重定义以满足特定的需求。本文将详细介绍 printf 函数的原型和重定义方法。 一、...

Global site tag (gtag.js) - Google Analytics