发新帖我要提问
12
返回列表
打印
[AVR单片机]

**中VC里面编写这样的 程序就会出错

[复制链接]
楼主: ATmega32L
手机看帖
扫描二维码
随时随地手机跟帖
21
atmega32l| | 2008-5-14 09:02 | 只看该作者 回帖奖励 |倒序浏览

C99标准关于 << 和 >>的描述

to 18 楼:

使用特权

评论回复
22
HWM| | 2008-5-14 11:48 | 只看该作者

to 21楼:

在C51中
    char c;
    ...
    sizeof(c<<1) = ?

在VC或C for ARM中

    char c;
    ...
    sizeof(c<<1) = ?

和int有何必然关系?

使用特权

评论回复
23
ATmega32L|  楼主 | 2008-5-14 12:22 | 只看该作者

sizeof(c<<1)的值等于sizeof(int)

  char c;
  sizeof(c<<1)的值等于sizeof(int)

如果某个编译器不是这样,只能说明这个编译器对标准C支持不好.

使用特权

评论回复
24
simon21ic| | 2008-5-14 12:51 | 只看该作者

按照C99的标准,这里23楼正确

c99的协议我全看过,这就是integer promotion
还有其他的运算符都有这个现象

使用特权

评论回复
25
HWM| | 2008-5-14 13:11 | 只看该作者

我也知道,问题是LZ所强调的那玩意儿有何意义?

表达式的中间结果一般确实是向上进行类型提升的,这不奇怪。问题是没有相应的变量去“承接”它,有实际意义吗?象如下表达式,充分说明了在C51中同样存在int提升的功能:

    int i;
    char c1, c2;
    ......
    i = c1 << 8 | c2;

但如果用sizeof( c1<<8 )去查看其“类型”长度确是一个字节,这有价值吗?
还是别对不存在的“中间变量”类型妄加揣测。没啥意义。

使用特权

评论回复
26
simon21ic| | 2008-5-14 13:19 | 只看该作者

呵呵,没有Lvalue,确实没有意义

其实LS所说的"承接变量",应该就是标准中的Lvalue,也就是左值
很多8位单片机的编译器并不是完全按照标准的,按照标准,sizeof(c1<<8)确实应该等于sizeof(int)。
实际代码中,为了避免这个问题,建议使用强制类型转换。

其实类似的讨论并没有太大的意义,要考虑的是移植性,就是不管特定的编译器对标准做如何的修改,代码都需要便于移植

再举个例子,函数指针:
void (*pf)(void);
pf = test;//test是一个此类函数,或者说常量函数指针
调用时按照C99标准应该是(*pf)();
但如果这么写pf();会怎么样。其实这种方式是C++的标准。
我发现我用的一些编译器都可以接受这种写法。

使用特权

评论回复
27
HWM| | 2008-5-14 13:23 | 只看该作者

实际根本就别这样用,移植性级差。

使用特权

评论回复
28
lwking412| | 2008-5-14 16:24 | 只看该作者

那个程序是我请教大家的,是数据手册的,应该不会有错

楼主是好人,教了我不少东西

使用特权

评论回复
29
simon21ic| | 2008-5-14 16:50 | 只看该作者

对于新手来说,C99的标准确实有必要看一下

对C语言可以更进一步的掌握,很PF LZ知道去标准中寻找答案。

但,你使用的编译器究竟是否100%按照标准呢?可能代码在这里没有错,但在其他的环境下会有问题。至少我碰到过不完全按照标准的编译器。
写代码的时候不要假定编译器会按照标准来处理,尽量使用显性的方式来处理

使用特权

评论回复
30
mcubug| | 2008-5-14 17:13 | 只看该作者

没办法呀

字符型         char        1           C字符集        
基本整型       int         2       -32768~32767    
短整型       short int     2       -32768~32767
长整型       long int      4    -214783648~214783647
无符号型     unsigned      2          0~65535
无符号长整型 unsigned long 4    0~4294967295
单精度实型  float          4   3/4E-38~3/4E+38
双精度实型  double         8  1/7E-308~1/7E+308
 

使用特权

评论回复
31
zuoyou| | 2008-5-15 11:44 | 只看该作者

re

18楼正解
那个船甚么的再看看吧

使用特权

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

本版积分规则