c语言常见错误百度知道,摘自百度知道的一个c语言问题

又一个TC与VC的截然不同:

#include

main(){

int i=5,j=5,p,q;

p=(i++)+(i++)+(i++);

q=(++j)+(++j)+(++j);

printf("%d,%d,%d,%d",p,q,i,j);

getch(); }

winTC输出结果:15,24,8,8

VC 6.0输出结果:15,22,8,8

谁能告诉我这到底是怎么回事啊?!真叫人无语!

这都是C语言,不同的编译器对于同一个程序(而且还是如此简单、如此基本的程序!!)却有不同的结果!我都不知道该相信哪个了,这岂不是

意味着我要用不同的编译器,还要去重新学习一遍C语言了?!

VC60默认编译器选项是这样的,为了优化代码的执行效率,在同一表达式连续累加的时候保持原值静态不变。你可以根据需要选择不同的编译

选项。

不单是VC60,包括GNU DEV

C++、G++等任何一种现代编译器,都在优化代码、优化地址空间上大做文章。你如果感兴趣,可以学习ANSI C为基

础标准,每种编译器对ANSI C的实现是不一样的,即使是GNU C++,那么标准化的程序,也只实现ANSI

C的97%语法标准。

对于上面的问题,有很多种解决方法:

1、不要尝试用一些很含混晦涩、不易阅读和书写的表达式,尽量以ANSI C语法为标准写;

2、如果要使用编译器特殊优化功能,请学会使用预定义和预编译选项,比如内存对齐、库函数调用:

#ifdef WIN32

#pragma pack(1)

#include

#else

#include

#endif

这样上面的代码就可以在WINDOWS和LINUX之间兼容编译畅通无阻。

这些内容在现代C语言都很常见的,真的没什么大惊小怪。要怪就怪老师本身对现代编译器内容很少介绍,而且也太图省事,只把垃圾一样的

TURBO C捧为经典。要知道TC是20年前的DOS产品,把所有问题归咎于古董而过于依赖是不对的。

虽然懒惰的老师们都应该被拖出去打屁股,但是聪明的学生应该懂得考试的时候怎么办,挣钱的时候又该怎么办。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值