首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

贴小弟我最近写的。4种循环取一个整数的位数。有一个疑点,求大大指教

2012-08-08 
贴我最近写的。4种循环取一个整数的位数。有一个疑点,求大大指教程序备注中有写。。。C/C++ codewhile(i++,num/

贴我最近写的。4种循环取一个整数的位数。有一个疑点,求大大指教
程序备注中有写。。。

C/C++ code
while(i++,num/=10){}


这里逗号表达式的出现,导致很纠结。。
while里面要求是逻辑值(0,非0)
我不编译的时候,我以为是while(i++){}……
但是……


各位大大,来解释吧。





PS:编译请用支持C99标准的编译器。

C/C++ code
#include <stdio.h>#include <stdint.h> /*************************************////////////////////////////////////////  求一个整数的位数                ////  filename = numdigit.c           ////   使用4种不同循环求              // //测试编译器c-free5(GCC4win:mingw5) // //   BY:  Y.A.N.E  http://yge.me    ////  2012-06-23                      ////////////////////////////////////////*************************************//**************************************** 额外备注:stdint.h只有C99标准中才有。__int64 是 stdint.h 自定的类型 long long 也是C99标准里的。 ****************************************//*  ↓↓↓函数声明开始  ↓↓↓*/int goto_digit(__int64 num);int do_digit(__int64 num);int while_digit(__int64  num);int for_digit(__int64 num);/*  ↑↑↑函数声明结束  ↑↑↑*/ int main(void){    __int64 x;x= 9223372036854775807;/////////////////////////////////////////////////32位编译器的MAX=9,223,372,036,854,775,807  ////Min=-9,223,372,036,854,775,808             ////自行控制,后续语句没有作判断取值的合法性   ///////////////////////////////////////////////// printf("Num = %lld\n\n",x);        if (x)        {                printf("使用goto构造循环:");            printf("%2.2d\n\n\n",goto_digit(x));                printf("使用do-while构造循环:");            printf("%2.2d\n\n\n",do_digit(x));                        printf("使用while构造循环:");            printf("%2.2d\n\n\n",while_digit(x));                        printf("使用for构造循环:");            printf("%2.2d\n\n\n",for_digit(x));        }    else printf("NUM = 0 时无意义\n");        /*要使用getchar();自行添加头文件。*/return 0;}/*  ↓↓↓  使用goto构造循环.开始   ↓↓↓*/int goto_digit(__int64 num){int i=0;goto two;two:if(num/=10)  /*相当num/=10; if(num) ……*/     {        i++;            goto two;          /*构造循环*/     }else return ++i;  /*等同于return (i+1) */}/*  ↑↑↑使用goto构造循环.结束     ↑↑↑*//*  ↓↓↓  使用do-while构造循环.开始   ↓↓↓*/int do_digit(__int64 num){int i=0;do {    i++;}while(num/=10);  return i; }/*  ↑↑↑使用do-while构造循环.结束     ↑↑↑*//*  ↓↓↓  使用while构造循环.开始   ↓↓↓*/int while_digit(__int64 num){int i=0;while(i++,num/=10){}/*****************************************不写注释应该很多新手看到会蛋疼不理解吧,其实上面使用do---while也可以如此。。还有goto循环中的if中也可以这样。 我只是在《c语言程序设计 现代方法 第二版》见过这个类似例子,拿到这里居然也可以用!并似乎可以应用在求逻辑值其他语句 。。 其执行步骤是这样的(根据执行结果猜的……)     【指 while(i++,num/=10){}的执行步骤】     i++;    while(num/=10)    {    i++;    } 至于这个原理,还是真不理解。。。 ****************************************/ return i; }/*  ↑↑↑使用while构造循环.结束     ↑↑↑*//*  ↓↓↓  使用for构造循环.开始   ↓↓↓*/int for_digit(__int64 num){int i=0;for(;num/=10;i++){}return ++i;    /**********************************************这里for后面虽然是空语句,但是花括号还是要加的,(当然可以用分号";")不然就循环执行return ++i 了。 还可以这样写,for(;i++,num/=10;){} 但如此返回是返回 i  而不是++i **********************************************/ }/*  ↑↑↑使用for构造循环.结束     ↑↑↑*/


[解决办法]
http://wenwen.soso.com/z/q193149362.htm
逗号语句顺序执行,逗号语句的值是最后一个表达式的值。
while(i++,num/=10),i++只是步进,不参与逻辑判断,num/=10的值作为while的判断条件。

热点排行