MISRA C:2012 8 Rules 8.1 A Standard C environment (Part 2)中,如何确保一个标准的C环境符合所有规定?
- 内容介绍
- 文章标签
- 相关推荐
本文共计800个文字,预计阅读时间需要4分钟。
0562赋值的右操作数指向更严格的类型+另一方面,使用类型为T的表达式初始化类型为const TYPE *或volatile TYPE *或甚至const volatile TYPE *的对象是完全合法的。
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 };
0591A ‘case‘ label must be an integral constant expression(整数常量表达式)
Integral constant expressions:
... are used incase expressions, to specifyarray bounds, to specify thesize of a bit-fieldand asenumerator constants.
They may contain:
- Integral constants 整型常数
- Enum constants 枚举常数
- Character constants 字符常数
- sizeofexpressions sizeof 表达式
- Floating constants cast to an integer type 浮点型强转成整形
... but maynotcontain (except as an argument to thesizeofoperator):
- 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; } }
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 done\n" );
break;
case ‘D‘ :
printf("You passed\n" );
break;
case ‘F‘ :
printf("Better try again\n" );
break;
default :
printf("Invalid grade\n" );
}
printf("Your grade is %c\n", 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("A\n");
break;
case 8:
case 7:
printf("B\n");
break;
case 6:
case 5:
printf("C\n");
break;
default:
break;
}
return 0;
}
本文共计800个文字,预计阅读时间需要4分钟。
0562赋值的右操作数指向更严格的类型+另一方面,使用类型为T的表达式初始化类型为const TYPE *或volatile TYPE *或甚至const volatile TYPE *的对象是完全合法的。
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 };
0591A ‘case‘ label must be an integral constant expression(整数常量表达式)
Integral constant expressions:
... are used incase expressions, to specifyarray bounds, to specify thesize of a bit-fieldand asenumerator constants.
They may contain:
- Integral constants 整型常数
- Enum constants 枚举常数
- Character constants 字符常数
- sizeofexpressions sizeof 表达式
- Floating constants cast to an integer type 浮点型强转成整形
... but maynotcontain (except as an argument to thesizeofoperator):
- 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; } }
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 done\n" );
break;
case ‘D‘ :
printf("You passed\n" );
break;
case ‘F‘ :
printf("Better try again\n" );
break;
default :
printf("Invalid grade\n" );
}
printf("Your grade is %c\n", 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("A\n");
break;
case 8:
case 7:
printf("B\n");
break;
case 6:
case 5:
printf("C\n");
break;
default:
break;
}
return 0;
}

