主要内容:“ ; ”符号有无细节、符号优先级、break;
一、;符号有无细节
见程序举例
二、符号优先级
*p++被编译器解释成*(p++)
三、break
switch语句中
四、其它细节
a、最简单的C语言程序为
main(){}
注意在有些开发环境可能这样还不能运行,在cfree就说无法定位,在linux用gcc编译运行成功严格来说要返回一个整型,因为函数默认返回int型
#include <stdio.h>
/*
最简单的C语言程序为
main()
{}
注意在有些开发环境可能这样还不能运行,在cfree就说无法定位,在linux用gcc编译运行成功
严格来说要返回一个整型,因为函数默认返回int型
*/
struct test{
int a;
int b;
int c;
} // 这里也是存在一个有无 " ; " 的问题,没有的话编译器不报错,
// 编译在struct结构体当成函数的返回类型,仅限后面是函数的情况下,
// 当然这个情况限于func()函数没有在调用前声明,如果把这几段程序放在mian函数后面,
// 并在main函数前声明func(),没有加返回类型,但是应该有默认返回int类型; 因为在声明时就确定了
// 返回类型 ,所以在这个情况下编译是会报错误的
func()
{
printf("test\n");
}
int main(int argc, char *argv[])
{
/* 1、函数指针调用,如 p是一个函数指针,调用p指向的函数必须写成(*p)();,写成*p(),编译器会解释成*(p());
* 2、类型转换也是单目运算符,单目运算符是自右向左结合,*p++被编译器解释成*(p++),即取指针p所指向的对象,然后将p递增1;而不是
* (*p)++,即指针p所指向的对象,然后将该对象递增1;
*/
int j,i = 3;
switch(i)
{
case 3:
printf("3\n");
case 1:
printf("1\n");
break; // 这是i = 3;缺少break就一直执行到有break的地方,如果都没break
// 就执行到default结束;
// 如果是你本人需要不加break,则好的做法是加上注释 ,如/*此处没有break*/
case 2:
printf("2\n");
default:
printf("default\n");
}
while(i >= 0) //如果在这里加了" ; " 这循环会影响代码逻辑 ,而这些编译不会报错
{
printf("i = %d\n",i);
i--;
}
func(); // func();是可以输出printf信息,返回类型没有加;转到上面有个隐含错误
func; // 上面的func();是函数调用;而这里什么也不做,精确讲是计算函数地址
if (i < 0)
return ; // 如果在这里少了" ; " 则返回5,下面”i = 5;而这些编译不会报错“
// 在缺少" ; "情况下,当你的i>= 0时 ,i = 5;则被略过了,少了这条赋值
// 语句后续有关操作就会潜在潜伏一个很深,很难发现一个bug
i = 5;
j = 4;
return 0;
}
输出: