wally-ye

2011年4月12日 #

运算符优先级

拾起一下被我忽视的东西!
 c语言的操作符共有15个优先级,如下:

  Operators Associativity

  ------------------------------------------------------------------

  运算符 结合性

  ------------------------------------------------------------------

  () [] -> . left to right

  ! ~ ++ -- + - * (type) sizeof right to left

  * / % left to right

  + - left to right

  << >> left to right

  < <= > >= left to right

  == != left to right

  & left to right

  ^ left to right

  | left to right

  && left to right

  || left to right

  ?: right to left

  = += -= *= /= %= &= ^= |= <<= >>= right to left

  , left to right

编辑本段三个优先级

  优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。

  所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。

  具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。

  其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。

编辑本段算术运算符

  接下来是算术运算符,*、/、%的优先级当然比+、-高了。

  移位运算符紧随其后。

  其次的关系运算符中,< <= > >=要比 == !=高一个级别,不大好理解。

  所有的逻辑操作符都具有不同的优先级(单目运算符除外,!和~)

  逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。

  跟在其后的&&比||高。

  接下来的是条件运算符,赋值运算符及逗号运算符。

  在C语言中,只有4个运算符规定了运算方向,它们是&&、| |、条件运算符及赋值运算符。

  &&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断。

  在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。

  赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。

posted @ 2011-04-12 02:23 wally_ye 阅读(98) | 评论 (0)编辑 收藏

2011年4月7日 #

main函数参数的用法

main函数参数的用法

main函数的声明
int main(int argc, char **argv)
或者
int main(int argc, char *argv[])
依据《C程序设计语言(第二版.新版)》的讲述:
第一个参数(习惯上称为argc,用于参数计数)的值表示运行程序时,命令行中参数的数目;
第二个参数(称为argv,用于参数的向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。

例子是在命令行模式下,在命令提示符$后输入:
$ echo hello,world
则会显示:
hello,world
$ (提示符,等待输入命令)

下面用C语言实现这个echo的程序:

//使用书中的第一个版本程序,文件名保存为 echo.c
#include <stdio.h>
/* echo command-line arguments; 1st version */
int main(int argc, char *argv[])
{
   int i;
   for (i = 1; i < argc; i++)
       printf("%s%s", argv[i], (i < argc-1) ? " " : "");
   printf("\n");
   return 0;
}
//编译,运行,结果什么也没有。

令行参数,进入到编译后产生可执行 echo 文件的目录,然后在命令提示符后输入:
$ ./echo hello,world
程序就会运行出来结果:
hello,word
$ (提示符,等待输入命令)

C语言约定:argv[0]的值是启动该程序的程序名,因此argc的值至少为1。
如果argc的值是1,说明程序名后面没有命令行参数。

《Linux高级程序设计(第二版)》中也有一个简单的main函数的例子。
//factorial.c的源程序
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
编译,生成factorial.o
//main.c源程序
#include<stdio.h>
#include<stdlib.h>
int factorial(int n);
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
    //argv[0]的值是启动该程序的程序名
    return -1;
}
   else
{
    n=atoi(argv[1]);//argv[1]读取的是第一个参数,atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
   return 0;
}
编译生成 main.o
然后在命令行将main.o 和factorial.o连接生成 factorial可执行程序,并测试带参数和不带参数执行:
$ gcc -o factorial main.o factorial.o //连接成可执行程序factorial
$ ./factorial     //不带参数执行factorial
Usage:./factorial    //结果返回输入的执行程序名
$ ./factorial 3     //带参数执行factorial,参数是3
Factorial of 3 is 6 .    //参数3被带到函数中,并执行函数操作,返回正确的值
$ ./factorial 3 4 5    //带参数执行factorial,参数3、4和5
Factorial of 3 is 6 .    //结果只执行第一个参数(函数中只调用第一个参数),其他参数忽略
$ (提示符,等待输入命令)

将它们转化为一个函数,在Windows下面试试:
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
       //argv[0]的值是启动该程序的程序名
       getch();
    return -1;
}
   else
{
    n=atoi(argv[1]);//argv[1]读取的是第一个参数,
    //atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
getch();
   return 0;
}
编译,连接,生成factorial.exe
进入生成目录,在DOS命令行执行:
>factorial.exe
Usage:factorial.exe

>factorial.exe 3
Factorial of 3 is 6.

>factorial.exe 4 5 6
Factorial of 4 is 24.

>(提示符,等待输入命令)
我们再修改一下这个程序,让它读取所有输入的参数
//文件名修改为 fac.c
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   int i;//加入循环控制变量
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
       //argv[0]的值是启动该程序的程序名
       getch();
    return -1;
}
   else
for(i=1;i<=argc;i++)
{
    n=atoi(argv[i]);//argv[i]读取的是第i个参数,
    //atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
getch();
   return 0;
}
编译,连接后生成fac.exe
再到命令行下进行测试:
>fac.exe
Usage:fac.exe

>fac.exe 3
Factorial of 3 is 6.
Factorial of 0 is 1.

>fac.exe 4 5 6
Factorial of 4 is 24.
Factorial of 5 is 120.
Factorial of 6 is 720.
Factorial of 0 is 1.

>(提示符,等待输入命令)
多出来一个
Factorial of 0 is 1.
原来是这里,多循环了一次,
for(i=1;i<=argc;i++)
修改为
for(i=1;i<argc;i++)
再试验一次(记得重启CMD,不然还是载入原来的程序):
>fac.exe
Usage:fac.exe

>fac.exe 3
Factorial of 3 is 6.

>fac.exe 4 5 6
Factorial of 4 is 24.
Factorial of 5 is 120.
Factorial of 6 is 720.

>(提示符,等待输入命令)

posted @ 2011-04-07 01:31 wally_ye 阅读(1681) | 评论 (0)编辑 收藏

仅列出标题