注册 登录
编程论坛 C语言论坛

这两行代码有什么区别?

b1592187525 发布于 2020-02-25 22:23, 1687 次点击
这是一个字符串比较函数,第二份代码即使给两个形参赋予相同的字符串"abc",但比较结果却不相同。原因出现在下面这两行语句中。
其中for(;*s1&&*s2&&*s1==*s2;s1++,s2++)与for(;*s1,*s2,*s1==*s2;s1++,s2++)这两行代码有什么区别?
第一份代码如下:
程序代码:
int function(char *s1,char *s2){
    for(;*s1&&*s2&&*s1==*s2;s1++,s2++)
    ;
    printf("%c  %c\n",*s1,*s2);
    return *s1==*s2 ? 0 : *s1>*s2 ? 1 : -1;
}

第二份代码如下:
程序代码:
int function(char *s1,char *s2){
    for(;*s1,*s2,*s1==*s2;s1++,s2++)
    ;
    printf("%c  %c\n",*s1,*s2);
    return *s1==*s2 ? 0 : *s1>*s2 ? 1 : -1;
}

9 回复
#2
forever742020-02-25 23:05
你看看余额,要是有钱就给我拿一万。   这是第一份
你看看余额,然后给我拿一万。   这是第二份

逻辑与或具有短路效应。
#3
b15921875252020-02-25 23:33
以下是引用forever74在2020-2-25 23:05:47的发言:

你看看余额,要是有钱就给我拿一万。   这是第一份
你看看余额,然后给我拿一万。   这是第二份

逻辑与或具有短路效应。

你说的太高深了,看不明白,对于第二份代码,我将两个形参都赋予字符串"abc",但printf语句却打印*s1的值为空,*s2的值为字符'a'.
为什么不是都为字符'a'?
#4
八画小子2020-02-25 23:52
*s1&&*s2&&*s1==*s2  : 先判断*s1是否为0,如果为0则表达式为假,如果为真则继续判断。然后判断*S2是否为0,如果为0则表达式为假,如果为真则继续判断。然后判断*s1与*s2是否相等,如果相等,则整个表达式是为真。
#5
八画小子2020-02-25 23:54
*s1,*s2,*s1==*s2    :*s1,*s2这两个表达式实际没什么作用,真正起作用的是*s1==*s2,判断*S1和*S2是否相等,如果不相等则整个表达式的值为假。
PS:自己百度了解一下逗号运算符的规则。
#6
八画小子2020-02-26 00:02
至于你说的第二份代码打印的问题,因为发生越界了,所以打印的操作对于程序逻辑是无效的。
#7
b15921875252020-02-26 00:44
以下是引用八画小子在2020-2-26 00:02:02的发言:

至于你说的第二份代码打印的问题,因为发生越界了,所以打印的操作对于程序逻辑是无效的。

对于第二份代码,假如我输入的形参为字符串"abc",那么函数除了依次比较字符'a','b''c'外,那么空字符'\0'有没有参与比较?
是不是当字符的值为空字符'\0'时才触发越界?还是说空字符'\0'的下一个位置才触发越界?
#8
八画小子2020-02-26 01:34
有有有
#9
八画小子2020-02-26 01:36
以下是引用b1592187525在2020-2-26 00:44:01的发言:


对于第二份代码,假如我输入的形参为字符串"abc",那么函数除了依次比较字符'a','b''c'外,那么空字符'\0'有没有参与比较?
是不是当字符的值为空字符'\0'时才触发越界?还是说空字符'\0'的下一个位置才触发越界?

对于第一个问号,空字符有参与。
对于第二个问题,并不是只有空字符的时候才发生越界。只要访问了不属于自己的内存空间就术语越界,通常是遍历数组的时候发生,主要是因为设置的停止条件有问题。。
#10
八画小子2020-02-26 01:37
要是有还问题,加我QQ896057905
1