学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1:三目运算符最后返回的是一个值,而不是变量本身,不可以作为左值使用。但是可返回地址,操作地址。
实验2:三目运算符的返回类型,有疑问,需要提问
实验3:逗号表达式
实验4:逗号表达式的应用,用一行代码实现 strlen,递归调用!!!牛皮!!!
实验1:三目运算符最后返回的是一个值,而不是变量本身,不可以作为左值使用。但是可返回地址,操作地址。
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a < b ? a : b;
(a < b ? a : b) = 3;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
实验2:三目运算符的返回类型,有疑问,需要提问
printf( “%d\n”, sizeof(c ? c : s) );//4 int ??? 不应该是 short 2吗
#include <stdio.h>
int main()
{
char c = 0;
short s = 0;
int i = 0;
double d = 0;
char* p = "str";
printf( "%d\n", sizeof(c ? c : s) );//4 int ??? 不应该是 short 2吗
printf( "%d\n", sizeof(i ? i : d) );//8
printf( "%d\n", sizeof(d ? d : p) ); // error 类型不匹配
return 0;
}
实验3:逗号表达式
#include <stdio.h>
void hello()
{
printf("Hello!\n");
}
int main()
{
/*
二维数组的初始化可以按行分段赋值,也可按行连续赋值。
例如,对于数组 a[5][3],按行分段赋值应该写作:
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行连续赋值应该写作:
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
这两种赋初值的结果是完全相同的。
这里的写法是逗号表达式,而且逗号表达式的值为最后一个子表达式的值,则变为
2
5
8
*/
int a[3][3] = {
(0, 1, 2),
(3, 4, 5),
(6, 7, 8)
};
int i = 0;
int j = 0;
//while 下面是一个逗号表达式
while( i < 5 )
printf("i = %d\n", i),
hello(),
i++;
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;
}
实验4:逗号表达式的应用,用一行代码实现 strlen,递归调用!!! 牛逼!!!
#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;
}