贴我最近写的。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的判断条件。