打印

我滴个神啊!这样子也可以?见38楼新进展

[复制链接]
11806|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-3-17 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XIANSir 于 2011-3-18 10:08 编辑

看看下面程序中加红的地方:
void LEDFlash(void)
{

static tmp = 0;

    if(f_LEDFlash == 1)
    {
        tmp++;
        if(tmp==LEDSpeed)
        {
            tmp = 0;
            LED8 = ~LED8;
            LED7 = ~LED7;
        }
    }
    else  

{

tmp = LEDSpeed-2;
        LED8 = 1;
        LED7 = 1;
    }
}
连数据类型都没有,Keil C51编译器竟然可以编译通过,更神的是程序运行也基本符合正常情况。

先把这个情况发出来,然后改过来运行一下看看现象有何变化。

后续实验现象持续更新中。

相关帖子

沙发
XIANSir|  楼主 | 2011-3-17 14:28 | 只看该作者
忘了说了,连个警告信息都没有!!!!:L

使用特权

评论回复
板凳
ayb_ice| | 2011-3-17 14:30 | 只看该作者
不是keil什么神
是你太"无知",好好去看C吧

使用特权

评论回复
地板
XIANSir|  楼主 | 2011-3-17 14:35 | 只看该作者
这个函数已经这样用了好几个月了,都没有发现,实在是因为,Keil竟然一点警告信息都没有。。。。:'(

使用特权

评论回复
5
johnwjl| | 2011-3-17 14:42 | 只看该作者
建议楼主把花在怀疑编译器的时间用来好好修炼一下自己的内功。

使用特权

评论回复
6
XIANSir|  楼主 | 2011-3-17 14:42 | 只看该作者
3# ayb_ice
嗯,的确是不知道C语言有这个特性。

刚才试了一下:凡是static(静态)变量和全局变量,都可以在定义时不写数据类型。我猜应该是C编译器默认他们为int类型了。

使用特权

评论回复
7
XIANSir|  楼主 | 2011-3-17 14:51 | 只看该作者
3# ayb_ice
不过,感觉编译器还是应该给出警告信息。

假如int是有符号类型的话,而我原本想把这个变量定义成无符号的uint却又忘了写类型,偏偏编译器又不给出警告,那么程序就可能运行错误。

所以,尽管是我无知,但是编译器连个警告都没有实在是不应该,至少不是最佳实践。

还有,编写程序时最好不要利用这个特性,虽然可以少打几个字母。但是在不同的编译器上,int可能是有符号的,也可能是无符号的。

使用特权

评论回复
8
XIANSir|  楼主 | 2011-3-17 15:04 | 只看该作者
5# johnwjl
在实践中学习更有针对性,也更有效。

而且我认为,这个特性实在没有优点——除了少打几个字母,这个特性应该被归类为C语言的阴暗角落。


虽然编译器不应该做违背C语言标准的事情,但是提供必要的警告信息以防止编程者误入C语言的阴暗角落却是非常合理和必要的。


C语言本身并不完美,由于历史的原因,它也有很多的缺点和阴暗角落。虽然C语言的进化应该慎之又慎,但通过编译器提供对潜在错误的警告也是对C语言的一种变相进化,而且是一种更加温和,更具可行性的升级和进化。


我们不应该以C语言以前是这样子的就拒绝对C语言的进化和改进,而且我也没有要求破坏性的进化,只是要求C语言编译器对C语言的潜在陷阱进行必要的提示而已。


我的要求很过分吗???











使用特权

评论回复
9
zjswuyunbo| | 2011-3-17 15:37 | 只看该作者
有一次我也看到了。很震惊!

使用特权

评论回复
10
XIANSir|  楼主 | 2011-3-17 16:21 | 只看该作者
9# ayb_ice
给个警告总不算是修改标准吧?


就算不能给警告!给个Information或Message总可以吧!难道编译器做不到吗???


而且,我很想知道:有谁认为C语言这个特性很好或者很有必要


知道该特性优点的可以列出来,让大家学习一下——该特性的缺点我已经在上面举出了一些了。

使用特权

评论回复
11
电子乌托邦| | 2011-3-17 16:34 | 只看该作者
支持lz,也有同样疑问!

使用特权

评论回复
12
XIANSir|  楼主 | 2011-3-17 16:36 | 只看该作者
12# 电子乌托邦
感动啊!终于有人支持一下啦:'(

使用特权

评论回复
13
ayb_ice| | 2011-3-17 17:02 | 只看该作者
优点就是省事,可以少写些字,其实就是默认的意思

使用特权

评论回复
14
SeaSun| | 2011-3-17 17:18 | 只看该作者
本帖最后由 SeaSun 于 2011-3-17 17:20 编辑

这种事情,大家习惯了就成标准.

前人这样做,大家也就这样跟着做了...

假若修改标准,用新编译器编译旧的源程序,估计警告满屏了.......这不被老鸟们骂死你才怪.

新程序员,你只能适应标准, 谁叫你是新来的.

使用特权

评论回复
15
XIANSir|  楼主 | 2011-3-17 17:27 | 只看该作者
14# ayb_ice
您也认为这是唯一的优点。

您是高手。缺点您肯定也应该很清楚的。

比较一下优点和缺点!您是不是也会认为:我们不应该使用这个特性。至少不应该被鼓励使用这个特性。

既然C语言标准不能改。那么是不是编译器本身应该起到劝诫作用,就是对这些不被鼓励使用的特性,在编码者使用时给出一定的信息和提示,比如:您正在使用一个有可能引起潜在错误的C语言特性,这个特性普遍不被鼓励使用,请慎重...

使用特权

评论回复
16
123jj| | 2011-3-17 17:38 | 只看该作者
呵呵,C标准就是这样~~~

使用特权

评论回复
17
XIANSir|  楼主 | 2011-3-17 17:43 | 只看该作者
15# SeaSun
改变肯定是痛苦的!
我们应权衡改变的得与失。

我认为可以这样处理:默认情况下,所有的警告信息都显示。对于高手,可以自己更改警告级别,把自己认为可以处理的警告信息屏蔽掉。

但是,我现在把Keil的警告级别已经调到最高了——Warninglevel2,可是Keil却也没有提供相应的信息。

使用特权

评论回复
18
XIANSir|  楼主 | 2011-3-17 17:48 | 只看该作者
本帖最后由 XIANSir 于 2011-3-17 18:03 编辑

当然了,我应该承认:我的标题确实不恰当。毕竟Keil不给警告和提示信息也不能算有问题。
也许之前Keil在我心里过于完美了,所以期望太高,自认为Keil应该做到这些。
另外,自己也确实是C学的不好,第一次遇到这样的现象,所以比较惊讶,于是写了个不太恰当的标题——必须得承认,这个才是主要原因:lol

使用特权

评论回复
19
singleywy| | 2011-3-17 19:22 | 只看该作者
这只是C语言的默认属性,其实如果对C很了解,就不会对此感到惊讶了,说到底,LZ的C语言功底还要深造呀

使用特权

评论回复
20
singleywy| | 2011-3-17 19:24 | 只看该作者
符合了C标准了,keil自然不会给出警告,所以LZ没必要纠结于此

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝