如今脑壳中记起的逗、转、表、语、C注

逗号表达式

逗号表达式

表达式说明

表达式1,表达式2,表达式3,...... ,表达式n

逗号表达式的要领:

(1) 逗号表达式的运算过程为:从左往右逐个计算表达式。

(2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。

(3) 逗号运算符的优先级别在所有运算符中最低。

[A]2,3,3 [B]2,3,2 [C]2,3,1 [D]1,1,1

解析:

x和y的值经过自增以后分别为2和3,D可以排除。剩下3个选项选择什么呢?

如果是(x++,y++,++y)实际上可以看成(1,1,3)整个逗号表达式的值应该是3,那么选A。

如果是(x++,++y,y++)实际上可以看成(1,2,2)整个逗号表达式的值应该是2,那么选B。

但这是错的,这儿还有赋值运算符。赋值运算符的优先级是14,而逗号表达式的优先级是15,也就是说上面的表达式中应该等价于这样的结合:(z=x++),y++,++y;如果这样写的话,则答案很清晰,为:2,3,1

正确答案选C。

与逗号表达式有关的题

例题1:(a = 3,b = 5,b+ = a,c = b* 5),求逗号表达式的值?

答案:40。前两个表达式只是赋值,从第三个开始计算,b+=a,即b=b+a,即b=5+3,b=8,求最后一个表达式,c=b*5=8*5=40.因为逗号表达式的值是最后一个表达式的值,所以整个逗号表达式的值为40,其他各变量最后的值依次为:a=3,b=8,c=40

例题2:若已定义x和y为double类型,则表达式:x=1,y=x+3/2的值是

A) 1 B) 2 C) 2.0 D) 2.5

分析:该表达式是一个逗号表达式,所以先运算x=1,结果变量x中的值为1.0,然后运算y=x+3/2,其结果是变量y中的值为2.0(这个运算过程可参阅本专题的"整数除法的注意事项"--整数相除,舍入法取整数部分),注意此时表达式y=x+3/2的值即等于变量y的值为2.0。最后,整个逗号表达式的值应该等于最后一个表达式的值2.0,所以,正确答案是C)。

注:该题曾在1998年4月和2000年9月的二级C考试中两次出现过。

例题3:若t为double类型,表达式t=1,t+5,t++的值是

A) 1 B) 6.0 C) 2.0 D) 1.0

分析:D该题的表达式也是一逗号表达式,运算过程同例题1。需要注意的是,其中的第二个表达式(t+5)对整个表达式的运算结果不产生任何影响,因为它没有改变变量t的值(t的值仍为1.0),最后一个表达式(t++)的值为变量t进行自增运算前的值1.0,所以整个表达式的值为1.0。

例如运行以下程序:

int a,b;

b=( a=1,a+1,a++);

printf("%d,%d\n",a,b);

输出打印:

2,1

注:这是1998年4月二级C考试中的一道选择题。

例题4:有如下函数调用语句

func(rec1,rec2+rec3,(rec4,rec5));

该函数调用语句中,含有的实参个数是

A)3 B)4 C)5 D)有语法错误

分析:A语言规定,函数调用时实参与实参之间是用逗号隔开的,所以,本题的函数调用语句中包含3个实参,其中第一个实参是rec1,第二个实参是rec2+rec3,第三个实参是(rec4,rec5),这里的第三个实参就是一个逗号表达式,根据逗号表达式的运算规则,第三个实参的值应该等于rec5的值。

注:这是2000年9月二级C考试中的一道选择题。

例题5:有如下函数调用语句

fun(a+b,(x,y),fun(n+k,d,(a,b)));

在此函数调用语句中实参的个数是

A)3 B)4 C)5 D)6

正确答案应该是A)。

注:这是1997年9月二级C考试中的一道选择题。

1、在 C 语言中,如果下面的变量都是 int 类型,则输出的结果是 . sum=pad=5; pad=sum + + ,sum + + , + + sum;

printf("%d\n",pad);

A) 7 B) 6 C) 5 D) 4

2、 设 有 如 下 定 义 : int x=10,y=3,z; 则 语 句 printf("%d\n",z=(x%y,x/y)); 的输出结果是

A) 1 B) 0 C) 4 D) 3

转义字符

字符表

所有的转义字符和所对应的意义:

注意:区分,斜杠:"/" 与 反斜杠:"\" ,此处不可互换

和是最常用的两个转义字符:

用来换行,让文本从下一行的开头输出,前面的章节中已经多次使用;

用来占位,一般相当于四个空格,或者 tab 键的功能。

单引号、双引号、反斜杠是特殊的字符,不能直接表示:

单引号是字符类型的开头和结尾,要使用表示,也即;

双引号是字符串的开头和结尾,要使用表示,也即;

反斜杠是转义字符的开头,要使用表示,也即,或者。

转义字符的初衷是用于 ASCII 编码,所以它的取值范围有限:

八进制形式的转义字符最多后跟三个数字,也即,最大取值是;

十六进制形式的转义字符最多后跟两个数字,也即,最大取值是。

超出范围的转义字符的行为是未定义的,有的编译器会将编码值直接输出,有的编译器会报错。

对于 ASCII 编码,0~31(十进制)范围内的字符为控制字符,它们都是看不见的,不能在显示器上显示,甚至无法从键盘输入,只能用转义字符的形式来表示。

转义字符以或者开头,以开头表示后跟八进制形式的编码值,以开头表示后跟十六进制形式的编码值。对于转义字符来说,只能使用八进制或者十六进制。

字符 1、2、3、a、b、c 对应的 ASCII 码的八进制形式分别是 61、62、63、141、142、143,十六进制形式分别是 31、32、33、61、62、63。下面的例子演示了转义字符的用法:

chara='\61';//字符1

charb='\141';//字符a

charc='\x31';//字符1

chard='\x61';//字符a

char*str1="\x31\x32\x33\x61\x62\x63";//字符串"123abc"

char*str2="\61\62\63\141\142\143";//字符串"123abc"

char*str3="The string is:\61\62\63\x61\x62\x63"//混用八进制和十六进制形式

转义字符既可以用于单个字符,也可以用于字符串,并且一个字符串中可以同时使用八进制形式和十六进制形式。

有以下程序:

void main(){

char a, b, c, *p;

a=’\’; b=’\xbc’; c=’\0xab’; p=”\0127”;

printf(“%c %c %c %c\n”, a, b, c, *p);

}

编译时出现错误,以下叙述中正确的是()

A. 程序中只有a=’\’;语句不正确

B. b=’\xbc’;语句不正确

C. p=”\0127”;语句不正确

D. a=’\’;和c=’\0xab’;语句都不正确

这道题里a= ‘\’是不正确的,必须是a= ‘\\’,因为\标识转义字符,如果是 ‘\’,那\’就会被当做转义字符,字符会缺一个单引号,语法错误,需要后面再加个单引号,如a= ‘\”,但这样得到的字符就是\’了。关于b和c,转义字符\h、\hh、\hhh斜杠后面的是1~3位八进制数,该转义字符为ASCII码等于该值的字符;转义字符\xh、\xhh的\x后面的是1~2位十六进制数,该转义字符为ASCII码等于该值的字符。所以b= ‘\xbc’是对的,相当于b=0xbc,也即十进制的-68,虽然这个数对于ASCII字符没有意义,但作为char的数值是没有错的(char是带符号八位整形,取值范围为-128~127);c= ‘\0xab’是错的,没有这个表示方法。p=“\0127”是对的,这里\012是一个转义字符,相当于八进制的12,查ASCII表可知是换行符\n,所以p相当于p= “\n7”。所以a和c变量是错的,答案选D。

不过实际编程实现了以后发现c= ‘\0xab’并没有报错,只是报了两个warning,字符最后打印的值是 ‘b’。

这是因为 ‘\0xab’ 其实是个多字符字符(multi-character character),它其实是四个字符 ‘\0’ ‘x’ ‘a’ ‘b’组成的,如果c是int类型的话,在windows系统下它的值会是7889250(120*256*256+97*256+98),但这里c是个char类型,所以它的值就是末尾的8bit,也就是最后一个字符 ‘b’。

表达式和语句

表达式(Expression)和语句(Statement)

其实前面我们已经多次提到了「表达式」和「语句」这两个概念,相信读者在耳濡目染之中也已经略知一二了,本节我们不妨再重点介绍一下。

表达式(Expression)和语句(Statement)的概念在C语言中并没有明确的定义:

表达式可以看做一个计算的公式,往往由数据、变量、运算符等组成,例如、等,表达式的结果必定是一个值;

语句的范围更加广泛,不一定是计算,不一定有值,可以是某个操作、某个函数、选择结构、循环等。

赶紧划重点:

表达式必须有一个执行结果,这个结果必须是一个值,例如的结果 17,的结果是 10,的结果是 5(printf 的返回值是成功打印的字符的个数)。

以分号结束的往往称为语句,而不是表达式,例如、等。

注释

注释

注释(Comments)可以出现在代码中的任何位置,用来向用户提示或解释代码的含义。程序编译时,会忽略注释,不做任何处理,就好像它不存在一样。

C语言支持单行注释和多行注释:

单行注释以开头,直到本行末尾(不能换行);

多行注释以开头,以结尾,注释内容可以有一行或多行。

#include

intmain()

{

/* puts 会在末尾自动添加换行符 */

puts("hello");

printf("C语言\n");//printf要手动添加换行符

return;

}

在调试程序的过程中可以将暂时将不使用的语句注释掉,使编译器跳过不作处理,待调试结束后再去掉注释。

需要注意的是,多行注释不能嵌套使用。例如下面的注释是错误的:而下面的注释是正确的:

/*C语言/*自学*/平台*/

/*C语言*/ /*hello*/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G1BATH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券