加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MISRA C:2012 8 Rules 8.1 A Standard C environment (Part 2)

发布时间:2020-12-16 09:15:09 所属栏目:百科 来源:网络整理
导读:0562?赋值的右操作数指向更严格的类型 On the other hand,it is perfectly legitimate(合法的) to initialize an object of type "const TYPE *" or "volatile TYPE *" or even "const volatile TYPE *" with an expression of type "TYPE *". const int *

0562?赋值的右操作数指向更严格的类型

On the other hand,it is perfectly legitimate(合法的) to initialize an object of type "const TYPE *" or "volatile TYPE *" or even "const volatile TYPE *" with an expression of type "TYPE *".

const int * a;? ?指向的内容是常量,指针本身可以变

int *b;

*b = 6;

a = b ;? 合法,以后不能通过指针a 修改,a所指向的内容

b = a; 不合法,b所指向的值可以随便改,与a的定义相悖。

extern int                *gpi;
extern const int          *gpci;
extern volatile int       *gpvi;
extern const volatile int *gpcvi;

void test(void)
{
    int                *xpi;
    const int          *xpci;
    volatile int       *xpvi;
    const volatile int *xpcvi;

    xpi = gpi;                /*              */
    xpi = gpci;               /* Message 0562 */
    xpi = gpvi;               /* Message 0562 */
    xpi = gpcvi;              /* Message 0562 */

    xpci = gpi;               /*              */
    xpci = gpci;              /*              */
    xpci = gpvi;              /* Message 0562 */
    xpci = gpcvi;             /* Message 0562 */

    xpvi = gpi;               /*              */
    xpvi = gpci;              /* Message 0562 */
    xpvi = gpvi;              /*              */
    xpvi = gpcvi;             /* Message 0562 */

    xpcvi = gpi;              /*              */
    xpcvi = gpci;             /*              */
    xpcvi = gpvi;             /*              */
    xpcvi = gpcvi;            /*              */
}

0588?位域宽度必须是整数常量表达式。

#define MAX 3.2f
#define X_WIDTH (int)MAX
#define Y_WIDTH (int)(1.9f * MAX)

struct bits
{
   unsigned int bx:X_WIDTH;     /* OK           */
   unsigned int by:Y_WIDTH;     /* Message 0588 浮点数 错误 */
};

0589?枚举常量必须是整数常量表达式。

#define MAX 3.2f
#define X (int)MAX
#define Y (int)(1.9f * MAX)

enum colours
{
    RED = X,YELLOW = Y,/* Message 0589 浮点数 错误*/
    GREEN,BLUE
};

?

0591?A ‘case‘ label must be an integral constant expression(整数常量表达式)

Integral constant expressions:

... are used in?case expressions,to specify?array bounds,to specify the?size of a bit-field?and as?enumerator constants.

They may contain:

  • Integral constants? 整型常数
  • Enum constants? ? 枚举常数
  • Character constants? 字符常数
  • sizeof?expressions? ?sizeof 表达式
  • Floating constants cast to an integer type? 浮点型强转成整形

... but may?not?contain (except as an argument to the?sizeof?operator):

  • Arrays
  • * operator
  • & operator
  • Structure member operations
#define A 1
#define B (int)2.
#define C 3.5
#define D (int)(2.2 * 2.5)

void foo(int n)
{
   switch(n)
   {
   case A:           /* OK: integer constant */
      break;
   case B:           /* OK: float cast to int */
      break;
   case C:           /* Message 0591: float expression  浮点数不可以 */
      break;
   case D:           /* Message 0591: not an integral constant expression 不是整数常量表达式 */
      break;
   default:
      break;
   }
}

?

https://blog.csdn.net/ishellhub/article/details/86285957

switch在C语言中的语法如下

switch(expression) {

   case constant-expression  :
      statement(s);
      break; /* optional */

   case constant-expression  :
      statement(s);
      break; /* optional */

   /* you can have any number of case statements */
   default : /* Optional */
   statement(s);
}

switch语句中使用的表达式必须具是int或enum类型,否则如float等其他数据类型是无法通过的编译的,因为编译器需要switch后面的语句和case后面的值精确匹配,而计算机无法精确表达一个float数据类型
switch可以任意个case语句(包括没有),值和语句之间使用:分隔
case后面的值必须是int常量值,或者返回结果为int类型的表达式,以下代码无法编译通过

当switch后面的变量值和case后面的常量值匹配相等后,case后面的代码将会被执行,直到break语句被执行后跳出switch代码块

break不是必须的,如果没有break,则执行完当前case的代码块后会继续执行后面case代码块的内容,直到执行break才可以退出

switch有一个默认的情况,我们用default关键词表示,当switch后面的变量和所有case后面的常量都不匹配的情况下,默认执行default后面的语句

/* example 1 */
#include <stdio.h> int main () { /* local variable definition */ char grade; scanf("%c",&grade); switch(grade) { case A : /* char与int是一回事 */ printf("Excellent!n" ); break; case B : case C : printf("Well donen" ); break; case D : printf("You passedn" ); break; case F : printf("Better try againn" ); break; default : printf("Invalid graden" ); } printf("Your grade is %cn",grade ); return 0; }
/* example 2 */

#include <stdio.h> int main() { printf("Please input your grade(1-100):"); int grade; scanf("%d",&grade); switch (grade / 10) { case 10: case 9: printf("An"); break; case 8: case 7: printf("Bn"); break; case 6: case 5: printf("Cn"); break; default: break; } return 0; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读