C语言初学者常见的一些问题。

一些常见头文件

#include<stdio.h>
#include<stdlib.h>
#include <string>
#include <iostream>
#include <math.h>

using namespace std;//使用命名空间std
C++标准库中的类和函数都是在命名空间std中声明的。
1.“=”和“==” 的错误使用。
错误的代码:

int main()
{
	int integer;
	integer = GetVars();
	if (integer = 234 )  //错误
	{
	
	}
	return 0;
}

错误使用后变量被错误赋值,逻辑判断不正确,错误处应该改为(integer = =234)
你在编译的时候可以发现这种错误!
2. 宏定义错误
错误的代码:

#define and1(x, y) (x) + (y)
#define and2(x, y) ((x) + (y))
int main()
{
	int b = 0;
	b = and1(1 + 2) * 5; 
	b = and2(1 + 2) * 5;
}

宏定义最常见的问题就是没有使用足够的括号去保证展开的正确性.
3. “++”和“–”在表达式中的应用.

int main()
{
	int i = 1, j = 2;
	for(i;i>=1;--i)
	{
	printf("输出i%d\n",i);
	i++;
	}
	return 0;
}

i++:先使用i,再把i的值加一
i–:先使用i,再把i的值减一
++i:先把i的值加一,再使用
–i:先把i的值减一,再使用
4. 没有特定意义的数字。

#define PI 3.14159
l = round / 3.14159;
Perimeter = 2* round * 3.14159;
Area = 3.14159 * R*R;

尽量用宏来定义,见名知意义
5.关于 Sizeof的问题。

struct class
{
	int a;
	char b[20];
}Node;
...
int x = 0;
struct Node* pstNode;
x = sizeof(Node); 
x = sizeof(pstNode);

Sizeof是一个编译时处理的操作符,最常见的问题就是混淆结构的大小和结构指针的大小。
6.全局变量在定义时的初始化。
错误的代码:

int array[9999][9999] ; 
int main(int argc, char* argv[])
{
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
int array[9999][9999] = {1};
int main(int arg, char* argc[])
{
	return 0;
}

这样写编译出来的exe文件 差距巨大。
全局变量再定义时初始化,会使exe文件增大,对于全局大数组,尽量避免再定义时初始化。
无论是否初始化,全局变量总是需要占内存空间,因此要避免定义不必要的全局变量。
7.extern 在函数声明中的意思。
它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中, 但在
extern int f();

int f();
之间并没有实质的区别
8.函数只定义了一次, 调用了一次, 但编译器提示非法重定义。
在范围内没有声明就调用 (可能是第一次调用在函数的定义之前) 的函数被认
为返回整型 (int) (且没有任何参数类型信息), 如果函数在后边声明或定义成其它
类型就会导致矛盾。所有函数 (非整型函数一定要) 必须在调用之前声明。
另一个可能的原因是该函数与某个头文件中声明的另一个函数同名。
9.函数指针的声明方法。

extern int func();
int (*fp)() = func

当出现一个函数名在这样的表达式中时, 它就会变成一个指针 (即, 隐秘
的取出它的地址), 这和数组名比较类似。
通常情况下函数的显示声明需要事先知道 (可能在一个头文件中)。因为此处并没有
隐秘的外部函数声明 (初始式中函数名并非一个函数调用的一部分)。
10.a[i] = i++这样的代码。
子表达式 i++ 有一个副作用 ,它会改变 i 的,由于 i 在同一表达式的其它地方被引用, 这会导致无定义的结果, 无从判断该引用(左边的 a[i] 中)是旧值还是新值。
11.逻辑表达式:共有&& || ! 三种逻辑运算符号。
!>&&>|| 优先的级别。
注意短路现象。如:x && y 中x若为0,不计算y; x || y中若x为非零值,则也不计算y。
表示 x 小于0大于9的方法:0<x<9是不行的,一定要用 (0<x)&&(x<9)表示
12.数据输入.
(1)scanf(“a=%d,b=%d”,&a,&b)
一定要记住是以第一部分的格式在终端输入数据。
在黑色屏幕上面输入的为 a=10,b=11才可以把10和11正确给a和b 。有一点不同也不可以。
(2)scanf(“%d,%d”,a,b);这种写法绝对错误,scanf的第二个部分一定是地址!
scanf(“%d,%d”,&x,&y);注意写成这样才可以!
(3)特别注意指针在scanf的考察
例如: int x=1;int *p=&x;
scanf(“%d”,x); 错误 scanf(“%d”,p);正确
scanf(“%d”,&p); 错误 scanf(“%d”,*p)错误
13.三种循环结构。
for循环当中必须是两个分号
do-while()循环的最后一个while();的分号一定不能够丢,do-while循环是至少执行一次循环。
break 和 continue的差别
break:是打破的意思,(破了整个循环)所以遇见break就退出整个一层循环。
continue: 是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。
14.一维数组的定义。
int a[1/4+2] 合法,同样是算术表达式
int a[2] 合法,最正常的数组
int a[6] 注意这个地方有一个重要考点,定义时数组的个数不是变量一定是常量。
int a[3-2] 合法,个数是常量2,是个算术表达式
int i=8,int a[i] 不合法,因为个数是x,是个变量,非法的,
#define N 6
int a[N] 合法,define 后的的N是符号常量,只是长得像变量罢了
a表示数组名,是第一个元素的地址,也就是元素a[0]的地址

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值