C语言三目运算符和逗号表达式
程序员文章站
2024-03-19 09:17:22
...
一、三目运算符定义:(a ?b : c) 当a的值为真时,返回b的值;否则返回c的值
二、三目运算符(a ?b : c) 返回类型:
1、通过隐试类型转换规则返回b和c中的较高类型
2、当b和c不能隐试转换到同一类型时将编译出错
下面通过写一段代码测试下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
char c1 = 0;
short s = 0;
int i = 0;
double d = 0;
char* p = "str";
c = a < b ? a : b;
(a < b ? a : b) = 3;//编译错误,因为三目运算符返回的是变量值,而不是变量,所以不能作为左值
printf("%d\n", a); //1
printf("%d\n", b); //2
printf("%d\n", c); //因为a < b所以为真,返回a的值,赋给c = a,所以c = 1
printf( "%d\n", sizeof(c1 ? c1 : s) );//根据隐式类型转换,char和short会转换成int类型,所以是4
printf( "%d\n", sizeof(i ? i : d) ); //根据隐式类型转换,int和double会转换成double类型,所以是8
printf( "%d\n", sizeof(d ? d : p) ); //double和指针类型不能转换同一个类型,所以编译error
return 0;
}
注释说的很明白,所以不讲了
三、逗号表达式
定义:逗号表达式是按照从左向右的顺序计算每个子表达式,逗号表达式的值是最后一个子表达式的值
通过定义我们可以知道逗号表达式实际是将多个子表达式组合到一起,形成一个表达式,同时子表达式可以没有返回值
下面通过写一段代码测试下:
#include <stdio.h>
void hello()
{
printf("Hello!\n");
}
int main()
{
int a[3][3] = {
(0, 1, 2),
(3, 4, 5),
(6, 7, 8)
}; //初始化一个二维数组
int i = 0;
int j = 0;
while( i < 5 ) //因为 i< 0 所以执行printf()函数,打印i的值,也就是0
printf("i = %d\n", i),//注意这里是一个逗号,不是分号
hello(), //输出”Hello!“ 注意这里也是一个逗号,不是分号
i++; //i递增 注意这里才是逗号,所以while里面包含三条语句
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);//输出二维数组
}
}
return 0;
}
再看下输出:
while循环里面执行了五次,这个好理解,因为while下面语句都是逗号,一直执行到分号,也就是i++后面,但是二维数组输出怎么只有[0]数组有数据,而且数据还不对,这是因为二维数组初始化不对造成的,正确初始化应该是这样的int a[3][3] = {{0,1,2},{3,4,5},{6,7,8}};中间不应该是(),中间是()时,编译器认为是逗号运算符,所以只有[0]数组有数据,而且是逗号最后的值,也就是2、5、8,其他数组都没有初始化,都是0
四、再写一个面试可能考的题目,要求用一条语句实现int strlen(const char *p)函数
好吧直接写答案
#include <stdio.h>
#include <assert.h>
int strlen(const char* s)
{
return assert(s), (*s ? strlen(s + 1) + 1 : 0);//递归用法
}
int main()
{
printf("len = %d\n", strlen("Delphi"));
printf("len = %d\n", strlen(NULL));
return 0;
}
这里注意:
为什么要加assert();不加可以么?请自己仔细分析吧
参考资料:狄泰软件C语言进阶教程
上一篇: JavaScript实现md5加密
下一篇: golang内存分配