【问题标题】:What does the && operator do when is it between two strings? [closed]&& 运算符在两个字符串之间时会做什么? [关闭]
【发布时间】:2013-01-01 16:56:55
【问题描述】:

在下面的代码中,str1[i] && str2[i];count1[str1[i]]++; 语句究竟做了什么?

char str1[4]="rate";
char str2[4]="tear";

int count1[256] ;
int count2[256] ;

int i=0;

for (i = 0; str1[i] && str2[i];  i++)
{
   count1[str1[i]]++;//count1['g']++what does that mean ?
   count2[str2[i]]++;
}

【问题讨论】:

  • 后者似乎确实在计算字符的出现次数。
  • int count1[256] ; 这只有在char 是 8 位时才有效,这是一个足够常见的假设,而无符号是一个不常见的假设。
  • int str1[]="rate"; 不起作用。只有 char 数组可以用文字字符串初始化。
  • 顺便说一下,您为什么不阅读&& 运算符?
  • @PascalCuoq:所以它可能应该是:int str1[] = L"rate";

标签: c syntax boolean-logic and-operator


【解决方案1】:
for (i = 0; str1[i] && str2[i];  i++)

相同
for (i = 0; (str1[i] != 0) && (str2[i] != 0);  i++)

相同
for (i = 0; (str1[i] != '\0') && (str2[i] != '\0';  i++)

基本上,如果在条件语句中使用了任何表达式,则检查该值是否为布尔值 - 真或假。如果它不是布尔值 - 假设它是一个整数类型,那么 0 是 false 其他任何值都是 true

这里的str[i]char - 这是一个整数类型。因此,如果 str[i] 为 0,则计算结果为 false,否则计算结果为 true。

例如。

char c = 'A';

if(c)

相同
if (c != 0)

相同
if (c != '\0')

c 是“A”(在 ascii 中是 65)。 65 != 0,因此它的计算结果为 true,并且将输入 if

如果你有

char c = 0;

char c = '\0';

然后 c 的计算结果为 0。因此 if(c) 的计算结果为 false 并且未输入 if。

您可以将相同的逻辑扩展到 str[i],它是一个 char

如果您有str1[]="rate",则与 str1[0] = 'r', str1[1] = 'a', str1[2] = 't', str1[3] = 'e', str1[4] = 0.

关于count1[str1[i]]++;

这是每个字符出现次数的计数 - 例如。如果 char 集是 ascii,则在字符串遍历结束时,count['A'](与 count[65] 相同)将包含字符串中出现 'A' 的次数。

只有在 count 数组的每个成员在某处(或者它们是全局的)初始化为 0 时才会起作用。

考虑

str1[] = "ABAB";

count[str1[0]]count['A'] 相同,count[65] 相同(如果字符集为 ascii)。

++ 将导致 count['A'] 变为 1

i 变为 1 时,count[str1[1]]++ 导致 count['B'] 变为 1。 i = 2,然后count['A'] 变为 2。 i = 3,然后count['B'] 变为 2。

【讨论】:

  • ++ 将导致 count['A'] 或 count[65] 变为 1。这里如何变为 1?这个计数值 1 将存储在哪里?下次出现相同字符('A')时如何递增到 2?
  • @krrishna 我假设 count[256] 的每个元素在某处初始化为 0 或者它是全局的。当第一个 ++ 发生时,特定元素变为 1。当第二个 ++ 发生时,它变为 2。当字母表为 'A' 且字符集为 ascii 时,这发生在 count[65] 为 'A's 和 count[ 66] 用于“B”等。
【解决方案2】:

此算法同时计算两个字符串中每个 ascii 字符的出现次数。

str1[i] && str2[i]

检查是否到达两个字符串的末尾。 count1[str1[i]]++ 增加字符 str1[i] 的出现次数。

【讨论】:

  • count1[str1[i]]++ 是否会增加每个字符 str1[i] 的出现次数?你能解释一下它是如何增加计数并存储每个字符的计数吗?
  • @krrishna - 我已经在我的回答中添加了这个。
【解决方案3】:

&& 应用于 2 个字符,而不是字符串。在这种情况下,它正在检查两个字符都不是空字符。

【讨论】:

    【解决方案4】:

    for (i = 0; str1[i] && str2[i]; i++)
    循环运行较小的字符串长度的次数。
    因为 '\0' 的 ASCII 值为零 (0) ,str1[i] 或 str2[i] 为零的意思是和都为零和循环结束

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多