c++-C++ 关于 printf的问题

问题描述

C++ 关于 printf的问题
 #include "stdafx.h"
#include "stdio.h"
int& f()
{
    int i = 10;
    int& j = i;
    return j;
}

int g()
{
    int j = 20;
    return j;
}

void main()
{
    int& ri = f();
    int rj = g();
    printf("ri=%dtrj=%dn", ri, rj, 1, 2, 3, 4, 5, 6, 7, 8);
    int &gi = f();
    int gj = g();
    printf("gi=%dtgj=%dn", gi, gj);
    getchar();
}

输出 ri = 4;
rj = 20;
gi = -858993460;
gj = 20;
printf("ri=%dtrj=%dn", ri, rj, 1, 2, 3, 4, 5, 6, 7, 8);这句不能理解咋执行的

解决方案

感觉这个函数的意义不是在于为什么会输出4,而是为什么ri没有输出10
在main函数中,调用了f函数,并且返回了一个局部自动变量i,该变量的内存是位于栈上的某个固定位置,该位置的值会被其他函数调用传递参数改变
例如调用rj=g(),printf("ri=%dtrj=%dn", ri, rj, 1, 2, 3, 4, 5, 6, 7, 8);因为值传递也是通过栈进行,稍微说下printf(),
printf()函数从参数列表的右端开始一项一项运算压栈到最左端的一个参数后,又从左端的控制符开始按控制符指令一项一项对应弹出。
总结:楼主没必要太纠结为什么会得到4,我这里用VS跑出来就是5,主要是为了说明使用生命周期已经结束的局部变量地址的不确定性

时间: 2024-11-05 18:44:00

c++-C++ 关于 printf的问题的相关文章

printf中两个格式符中间出现冒号是什么意思?

问题描述 printf中两个格式符中间出现冒号是什么意思? 请教一下代码中的冒号是什么意思? printf("%s : %dn",_FILE_,_LINE_); 解决方案 没意思,就是输出的时候,第一个值和第二个值之间用冒号隔开,方便查看. 解决方案二: 就是冒号,%s和%d会被后面两个值代替,中间冒号隔开 解决方案三: 这没什么意思啊,就是原样输出吧 解决方案四: 冒号没特别的意思, 比如说你的 FILE 是 " test.c", 然后 LINE 是 33 的话,

显示-printf和输出格式疑问

问题描述 printf和输出格式疑问 问题出在printf int main(){ int i=1; float f=5; printf(""%d %f %dn""ifi); printf(""%d %d %d %dn""ifii); printf(""%d %d %d %dn""i(int)fii); printf(""%d %d %dn""ii

Printf格式输出

printf()输出各种类型 完整格式:%-0m.nl或者h格式字符 % 转换说明的开始(占位符)不能省略 - 左对齐,省略 右对齐 0 有0代表空位填0, 省略代表空位不填 m.n m域宽 指对应的输出项在输出设备占用多个字符的宽度        n精度 输出浮点数的时候 小数点后面的位数 l  整数long浮点数double h 将整数的格式休整为short i/d 输出十进制整数 o 无符号的八进制整数 x 十六进制 u 无符号的十进制 c 输出一个字符 s 输出一个字符串 f 输出一个浮

C语言printf()输出格式大全

1.转换说明符       %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)       %c             字符       %d             有符号十进制整数       %f              浮点数(包括float和doulbe)       %e(%E)     浮点数指数输出[e-(E-)记数法]       %g(%G)     浮点数不显无意义的零"0"       %i              有符号十进制整数(

C语言实现printf的基本格式输出%d,%c,%p,%s

关于printf的实现,想必看过我之前发表的文章的伙伴们已经了解了不少基本的知识.好了,接下来不多说了,直接上源码,看看一种简单的实现方式:        #include <stdio.h> #define myfflush(out) do {} while (0) typedef int uint32_t; //输出十进制数 static void print_Dec (uint32_t n) { if (n >= 10) { //递归调用 print_Dec(n / 10); n

中断处理程序不能使用printf的本质

vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位.所以vxworks不用printf的原因在于阻塞. 网上说printf 因为引用全局变量stdout,所以是不可重入的.这个稍微解释一下.如果用到了全局变量,但是用信号量保护,是线程安全的,但是不可重入的(会导致死锁,譬如一个任

[原创]另类调用 printf 完成任务的方法

昨天逛csdn/c版,看到如下一道题: 函数原形已经给出:int p(int i, int N); 功能:调用该函数,打印如下格式的输出,例p(1, 7); 1234567654321 即每行一个数字.(注意:N只打印一次) 要求: 1. 函数中唯一能够调用的函数就是printf.2. 不准使用如下的关键字:typedef, enum, do, while, for, switch, case, break, continue, goto, if. 3. 不能使用逗号表达式和?:表达式. 4.

php printf输出格式使用说明

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少. ②-:有-表示左对齐输出,如省略表示右对齐输出. ③0:有0表示指定空位填0,如省略表示指定空位不填. ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数.N指精度.用于说明输出的实型数的小数位数.为指定n时,隐含的精度为n=6位. ⑤l或h:l对整型指long型,对实型指double型.h用于将整型的格式字符修正为short型. ---

printf()和scanf()中的控制字符串与转换说明符和转换说明修饰符

一.printf()函数 1. (格式)转换说明符 2. (格式)转换说明修饰符 注:printf()中float和double统一用%f,没有%lf这种用法,long double用%Lf 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/

从printf谈可变参数函数的实现

一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的强大适应性,让人产生了对它进行探索的浓厚兴趣. 1.使用情形 int a =10; double b = 20.0; char *str = "Hello world"; printf("begin print\n"); printf("a=%d, b=%.3f, str=%s\