首页
社区
课程
招聘
[求助]关于c语言中的两个小问题求解
发表于: 2013-12-19 21:12 5109

[求助]关于c语言中的两个小问题求解

2013-12-19 21:12
5109
学了一段时间的c语言,感觉还是没摸着门,继续啃ing...

其实这两个问题以前就碰着了,一致没解决,今天鼓起勇气发出来,大大们莫笑啊

CODE 1:vs2008下
#include <stdio.h>

int main()
{
	short int short_i = -123;
	printf("%X \n", short_i);
	
	return 0;
}

这段小程序主要是以16进制形式输出-123,理论上应该输出FF85才对,但是输出的结果是FFFFFF85,想了半天发现%X是输出无符号16进制的,问题来了,怎么才能输出带符号的16进制数(在c语言中实现非c++)

CODE 2:vs2008下
#include <stdio.h>

int main()
{
	int i = 1;
	printf("%d \n", i);
	int j = 1;
	printf("%d \n", j);

	return 0;
}

出错,而下面的正确编译
#include <stdio.h>

int main()
{
	int i = 1;
	int j = 1;
	printf("%d \n", i);
	printf("%d \n", j);

	return 0;
}

我觉得已经遵守了变量先定义后使用的规则了,为啥还是不对好呢?
期待大大们的解答,小白这厢有礼了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第一个问题:FFFFFF85也是有符号数啊,只不过是输出的位数不对吧。
第二个:在C语言中,好像局部变量的声明必须放在一个语句块的开始处。
2013-12-19 21:31
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1、%X本身输出就是无符号的,要带符号自己判断
2、C语言中变量定义貌似要在函数前面,不能中间定义,C++可以随意
2013-12-19 21:31
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CODE1应该是正确的,估计是你的运行环境选择错了。。

CODE报错是因为
“C语言中所有的变量定义语句必须放在执行语句之前(即变量定义要放在函数的最开始几行),否则就会出错”
2013-12-19 21:36
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那要怎么才能让它输出正确的FF85呢
2013-12-19 21:49
0
雪    币: 357
活跃值: (3398)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
6
&0xffff
2013-12-19 22:18
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这就是`printf`的弊端了, 你传递进去的参数的实际类型是被丢弃了的, 函数内部会按照你的格式字符串中的信息来解读参数, `%x`要求的输入是一个`unsigned int`, 而且它也没办法验证你给出的参数到底是不是这个类型, 所以你不管传什么类型的参数, 都只能被当做`unsigned int`来解读.

这个问题用纯C如果不修改接口应该是没法解决的, 但是c++的variadic template可以很轻松的写出类型安全的`printf`

        template<typename T, typename... Args>
        void printf(const char *s, T value, Args... args)
        {
                while (*s) {
                        if (*s == '%') {
                                if (*(s + 1) == '%') {
                                        ++s;
                                }
                                else {
                                        std::cout << value;
                                        printf(s + 1, args...); // call even when *s == 0 to detect extra arguments
                                        return;
                                }
                        }
                        std::cout << *s++;
                }
                throw std::logic_error("extra arguments provided to printf");
        }
2013-12-20 08:48
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
第一个:printf("%hX \n", short_i);
你想要的应该是这个吧。printf不是跟进后面的参数列表判断输出的,而是根据第一个参数。第一个参数的完整格式是%[flags][width][.precision][length]specifier,详细解释看这http://www.cplusplus.com/reference/cstdio/printf/

第二个:C语音要求所有定义在函数开始位置。
这个是有原因的,C语音诞生的年代汇编还是很普遍的,C语音很接近汇编。函数的开始位置通常会先修改栈寄存器,把所有局部变量的空间预留出来,所以C语音的局部变量也是要求在函数开始位置申请。之后C++中对这个约束进行了改进。而且这个函数在起始位置定义变量,还和到后来被认为有害的goto语句有一些关联,C++中就体现这个限制。
2013-12-20 11:46
0
雪    币: 4928
活跃值: (967)
能力值: ( LV9,RANK:175 )
在线值:
发帖
回帖
粉丝
9
用%#X这个格式应该能输出前导符。
2014-3-29 16:49
0
雪    币: 4928
活跃值: (967)
能力值: ( LV9,RANK:175 )
在线值:
发帖
回帖
粉丝
10
第二个我运行时也没报错啊,编译通过。。。
2014-3-29 16:53
0
雪    币: 655
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
上面已说的很清楚
2014-3-30 16:21
0
雪    币: 168
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
学习了,呵呵呵
2014-3-31 19:16
0
游客
登录 | 注册 方可回帖
返回
//