1.输出数据对齐问题
Printf(“%-6x”,x); 输出的数据是左对齐,没有加 - 是右对齐。
左对齐:
printf(“%d\n”,101010); 默认的方式是左对齐。
printf(“%-10d\n”,101010); 在打印数字宽度前面加一个“-”也是左对齐,10表示数字宽度为10,
如果打印的位数小于10,则后面补足空格,如果打印的位数大于10,则打印所有的数字,不会截断。
printf(“%10d”,101010); 在%和d之间加上数字宽度,就可以右对齐了,10表示数字宽度为10,
如果要打印的位数小于10,左边补足空格,如果打印的位数大于10,则打印所有的数字。
但是打印出来的效果是一样的。
2.复合语句注意点
#include "stdio.h"
int main(void)
{
a = 30, b = 20, x;
if(a > b)
{
x = a;
printf("%d\n",a);
}
else
x = b;
printf("%d\n",b);
return 0;
}
程序的运行结果: 30 20
程序本来的目的是输出a,b两个数中较大的数并存入x中,但是却把两个数都输出了,错误的原因
在于else分支的两条语句该用{ }括起来,不能用上下对齐的方式来表示复合语句。
3.Int a=1, b=2, c=3; 以下语句中的执行效果与其他3个不同的是(C)
A if(a>b)c=a,a=b,b=c;
B if(a>b) {c=a,a=b,b=c;}
C if(a>b)c=a;a=b;b=c;
D if(a>b){c=a,a=b,b=c; }
逗号可以将两个表达式分开,形成一个表达式。而用;;分隔开的属于3个项目。
4.惰性计算方法
#include "stdio.h"
void main()
{
int n = 2, k = 0;
while(k++&&n++>2);
printf("%d %d\n",k,n);
}
输出的正确答案是1 2
刚开始运算的时候,k的值是0,n的值是2,并还没有进行自增1的操作,自增1要在下一次循环中。
对于循环条件(k++&&n++>2),首先计算k,由于k的初值为0,k++是后坐,因此k++在参与比较
的时候是0(假),比较以后k值增1(变为1),这时,系统不会再计算&&后面的表达式了(即
所谓的惰性计算方法),所以,n++>2没有参与运算,也就是说,循环语句执行之后,k的值是1
n的值是2.
在a<b && c < d; 中得保证a<b不等于0才会对c<d进行运算。
5.运算符优先级问题
单目运算符优先级比双目运算符的高,在双目运算符中,算术运算符的优先级最高,
移位运算符次之,关系运算符再次之,最后是逻辑运算符。
i = 0;
while(i < n)
y[i] = x[i++];
这个程序是不正确的,因为有时候可能在i自增之前被求值。
6.形参和实参
int gcd(int a, int b) //函数定义
调用形式可以是gcd(x,y), 也可以是gcd(60,36);
函数定义中的a和b是形式参数,函数调用时x和y是实际参数,60和36也是实际参数。
实际参数是表达式,由于变量也构成一个表达式,实际参数也可以是变量,但是形式参数
只能是变量。
数据的传递是 单向的,只能是从实参向形参传递。
在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是 c
A. 地址传递 B. 由实参传给形参,再由形参返回实参 C. 值传递 D. 传递方式由用户指定
C++中以下关于函数调用的说法哪个是正确的? D
A. 传地址后实参和形参指向不同的对象 B.传引用后实参和形参是不同的对象 C.传值后对形参的修改会改变实参的值 D.其他三项都不对
7.函数间的传参
#include "stdio.h"
void swap_fail(int a,int b);
int main()
{
int i,j;
i = 2,j = 4;
printf("调用前 i = %d, j=%d\n",i,j);
swap_fail(i,j);
printf("调用后 i = %d, j=%d\n",i,j);
return 0;
}
void swap_fail(int x,int y)
{
int temp;
printf("交换前x=%d,y=%d\n",x,y);
temp=x; x=y; y=temp;
printf("交换后x=%d,y=%d\n",x,y);
}
运行结果:
调用前 i=2, j=4 交换前 x=2,y=4
交换后 x=4,y=2 调用后 i=2, j=4
本程序中函数swap_fail()不能 将两个数据进行交换,因为i和j作为实参只是将自己的值传给
形参x和y,i和j并没有因为形参的变化而变化。
传递的是地址:
#include "stdio.h"
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
输出结果:2 1 2 1
传递的是指针:
#include "stdio.h"
void foo(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
void main()
{
int a = 1, b = 2, c = 3;
foo(&a, &b);
foo(&b, &c);
foo(&c, &a);
printf("%d, %d, %d", a, b, c);
}
输出结果:1,3,2
8.静态变量static
作用域:内部静态变量的作用域仅在定义它的函数和分程序中有效。
生存期:无论是静态变量还是外部变量都是永久的,即使程序退出函数的执行,该函数的
内部静态变量也任然不被系统调用。
static第一条特性:隐藏。
外部静态变量的作用域是在定义它的同一源文件中,同一源文件的各个函数可以共享该变量,
其他源文件不能访问。
static第二条特性:持久记忆性。
#include "stdio.h"
static int y=10;
int main()
{
int i;
void decr();
for(i=1;i<=3;i++)
decr();
return 0;
}
void decr()
{
static int x=10;
x--;
y--;
printf("\n x=%d y=%d",x,y);
}
结果: x=9 y=9
x=8 y=8
x=7 y=7
dexr()函数中的x是内部静态变量,初始化后,内容为10,decr()函数每次被调用,x的值减1,
从decr()函数退出,该空间也不 释放,下一次进入decr函数时,原来的x值有效,但是尽管x
是有记忆的,但是作用域只局限于decr()函数内。
Static第三条特性:默认初始化为0.
9.错误的函数定义
#include "stdio.h"
int function(x) //错误的函数定义
{
int x,y; //形式参数不能写在函数内部
y=3*x*x+2*x+1;
return(y);
}
在这个例子中,x是函数的形式参数,y是函数内部使用的变量,但是,程序中将函数的形式参数
的类型定义在{ }里面,引起了错误。
10.函数调用的时候,参数不能带数据类型
#include "stdio.h"
int function(int x)
{
int y;
y=3*x*x+2*x+1;
return(y);
}
int main()
{
int x;
printf("请输入一个整数");
scanf("%d",&x);
printf("x=%d f(x)=%d\n",x,function(int x));
return 0;
}
printf("x=%d f(x)=%d\n",x,function(int x)); 对函数function( )的调用方式是错误的,因为函数调用
的时候,参数是不带数据类型的。