C语言逗号表达式赋值、野指针成因、用户标识符、字符串赋值的几个概念

目录

题目

背景概念梳理

逗号表达式

野指针成因

用户标识符

字符串赋值

解题过程

正确答案

整体代码

参考链接


题目

一、输出x及a的结果

int main(){
	int x,a;
	x = (a=3, a+1);
} 

二、野指针都是由指针未初始化导致的吗?

三、如下不能定义为用户标识符的是?

A, Main
B, _0
C, _int
D, sizeof

四、如下正确进行字符串赋值操作的是?

A,char s[5] = {"ABCDE"};
B, char s[5] = {'A','B','C','D','E'};
C,char* s; s = "ABCDE";

背景概念梳理

逗号表达式

        逗号表达式的结果是逗号表达式中最后一个式子的值。逗号表达式分两种,一种是“(a,b,c,d)”该值返回的是d值(返回最后一个式子的值);另一种,"a,b,c,d"返回的是a值。

int main(){
	int x,y,z,a;
	x = (a=3, a+1);
	printf("x: %d\n",x); 
	printf("a: %d\n",a); 
	
	y = (a, a+3, a+2);
	printf("y: %d\n",y); 
	
	z = a, a+5, a+6;
	printf("z: %d\n",z); 
} 
//结果输出:
x: 4    a: 3   y: 5   z: 3
--------------------------------
Process exited after 0.02346 seconds with return value 5
请按任意键继续. . .

野指针成因

         如果说野指针问题,谁都知道野指针是由于未对指针变量初始化导致的,但如果说所有的野指针都是由于指针变量未初始化导致的吗?恐怕会打鼓,但有一时想不出还有其他的例子(我就是),

        野指针的定义是指向不可以地址(非法内存地址)的指针。

        按这个定义举例,除了未初始化还是有一些的:

        (1)指针越界访问;(2)指针指向的空间被释放了(3)指针未初始化。

用户标识符

        用户标识符是指用户根据需要自己定义的用来标识某个实体的一个符号;一般用来给变量、函数、数组等命名,以建立起名称与使用之间的关系。标识符由字母、下划线、数字组成,并且第一个字符必须是字母或下划线,不能是数字。

命名规则:

(1)标识符是由字母、下划线、数字这三个方面组成的,但开头的一百一定是字母或下划线;

(2)标识符不能使用系统的预定义标识符;

(3)C语言中的标识符是区分大小写的;

(4)用户标识符可以用作变量名

字符串赋值

给字符串赋值,

方式一:可以在定义的时候直接用字符串赋值,如选项A那样,但不能先定义再给它赋值,如:

//wrong!
char a[5];
a[5] = "ABCDE";

方式二:对数组中字符逐个赋值

如选项B,“char s[5] = {'A','B','C','D','E'};”,逐个赋值,也可以。

方式三:利用strcpy

char s[5]; 
strcpy(s, "ABCDE");

方式四: 直接通过指针来赋值

如选项C"char* s; s = "ABCDE";"。

解题过程

一、返回最后一个式子的值。

二、还有其他造成野指针的成因存在。

三、BC项是符合命名规则的,不论;A项看似和主函数的定义想冲突,但实际上用到的主函数定义是“Main()”,并不是“Main”,故没问题;剩下的是D项,sizeof是一个运算符,明显是一个预定的标识符,如果与预定义标识符相同,则在编译时不会出现错误,但会丢失预定义标识符的原始意图或导致错误,因此通常不将预定义标识符用作用户标识符。

正确答案

一、x=4,a=3

二、不是。

三、选D

四、都正确

整体代码

#include<stdio.h>
//一、
int main()
{
	int x,y,z,a;
	x = (a=3, a+1);
	printf("x: %d\n",x); 
	printf("a: %d\n",a); 
	
	y = (a, a+3, a+2);
	printf("y: %d\n",y); 
	
	z = a, a+5, a+6;
	printf("z: %d\n",z); 
} 
#include<stdio.h>
//四、
int main()
{
	char s1[5] = {"ABCDE"};	
	printf("s1: %s\n",s1); 
	
	char s2[5] = {'A','B','C','D','E'};
	printf("s2: %s\n",s2);
	
	char *s3;
	s3 = "ABCDE";
	printf("s3: %s\n",s3);
	
	char s4[5]; 
	strcpy(s4, "ABCDE");
	printf("s4: %s\n",s4);
} 
//输出结果:
s1: ABCDE
s2: ABCDE
s3: ABCDE
s4: ABCDE

--------------------------------
Process exited after 0.02269 seconds with return value 10
请按任意键继续. . .

参考链接

逗号表达式与赋值语句_飞天土豆的博客-CSDN博客_赋值表达式和逗号表达式逗号表达式的结果是逗号表达式中最后一个式子的值。两种逗号表达式与赋值语句的区别,例如:a=b,c;这个式子的最后的结果a的值是b,因为此时因为逗号低于赋值运算,故b先赋值给a,然后再计算逗号表达式。a=(b,c);这个式子的最后结果a的值是c,因为先算括号内的此时逗号表达式的值为c,然后将c的值赋值给a.#include&lt;stdio.h&gt; int main(void){...https://blog.csdn.net/qq_40456669/article/details/80625369详细讲解 —— 指针(C语言初阶)_IT_Infector的博客-CSDN博客icon-default.png?t=LA92https://blog.csdn.net/IT_Infector/article/details/120248670以下不能定义为用户标识符的是( ) A ) main B) _ 0 C) _int D) sizeof_百度知道icon-default.png?t=LA92https://zhidao.baidu.com/question/240643569.htmlC语言:字符串赋值的方法_cherish_xmm的专栏-CSDN博客_c语言字符串赋值main() { char s[30]; strcpy(s, "Good News!"); /*给数组赋字符串*/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s。当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标文件的https://blog.csdn.net/cherish_xmm/article/details/43267603

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值