TWO SUM 问题中 if 语句的带括号的不同输出
Different output with brackets for if statement in TWO SUM proble
我在这里附上 link 到 leet 代码中的 TWO SUM 问题:https://leetcode.com/problems/two-sum/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
*returnSize=2;
int *arr=malloc(sizeof(int)*2);
int i,j;
for(i=0;i<numsSize-1;i++){
for(j=i+1;j<numsSize;j++){
printf("i= %d j=%d,ans=%d\n",nums[i],nums[j],nums[i]+nums[j]);
if(nums[i]+nums[j]==target){
arr[0]=i; arr[1]=j;
}
}
}
return arr;
}
在上面代码的 if statement
中添加大括号后会产生以下输出output image
但是如果我删除了 if statement
的大括号,那么我会得到一个不同的输出,如图所示 bracket of if statement removed
没有大括号,只有 if
(arr[0]=i
) 之后的第一条语句被执行。而如果 if
的大括号存在,则执行大括号内的所有语句。
C 在缩进方面不像 Python(可能还有其他一些语言),并且编译器不会解释您的两个 separate 语句在 if (...)
作为条件块的主体之后。所以,没有花括号,只有第一个语句(arr[0]=i;
)构成了条件块,第二个语句(arr[1]=j;
)不管结果如何都会被执行测试。
if
块的主体是 单个 语句或 'scope block' (有时称为 复合 语句),由 { ... }
大括号分隔。
在此 if 语句中不使用大括号
if(nums[i]+nums[j]==target){
arr[0]=i; arr[1]=j;
}
你实际上有
if(nums[i]+nums[j]==target) arr[0]=i;
arr[1]=j;
所以这个声明
arr[1]=j;
无条件执行。
例如,您可以使用一个带有逗号运算符表达式的语句,例如
if(nums[i]+nums[j]==target)
arr[0]=i, arr[1]=j;
得到预期的结果。
注意你的方法效率低下。一旦找到所需的数组元素对,嵌套循环应立即停止迭代。
这个参数
int* returnSize
没有意义,因为此指针指向的对象始终设置为 2。
动态分配内存不是一个好主意。
另外你没有初始化分配的内存。因此,如果未找到所需的数组元素对,您将返回一个具有不确定值的数组。
我将按照以下演示程序中所示的方式声明和定义函数。
#include <stdio.h>
struct Pair
{
size_t first;
size_t second;
};
struct Pair twoSum( const int *nums, size_t numsSize, int target )
{
struct Pair pair = { .first = numsSize, .second = numsSize };
int found = 0;
for ( size_t i = 0; !found && i < numsSize; i++ )
{
for ( size_t j = i + 1; !found && j < numsSize; j++ )
{
if ( nums[i] + nums[j] == target )
{
found = 1;
pair.first = i;
pair.second = j;
}
}
}
return pair;
}
int main( void )
{
int a1[] = { 2, 7, 11,15 };
size_t n = sizeof( a1 ) / sizeof( *a1 );
int target = 9;
struct Pair pair = twoSum( a1, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
int a2[] = { 3, 2, 4 };
n = sizeof( a2 ) / sizeof( *a2 );
target = 6;
pair = twoSum( a2, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
int a3[] = { 3, 3 };
n = sizeof( a3 ) / sizeof( *a3 );
target = 6;
pair = twoSum( a3, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
return 0;
}
程序输出为
[0,1]
[1,2]
[0,1]
我在这里附上 link 到 leet 代码中的 TWO SUM 问题:https://leetcode.com/problems/two-sum/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
*returnSize=2;
int *arr=malloc(sizeof(int)*2);
int i,j;
for(i=0;i<numsSize-1;i++){
for(j=i+1;j<numsSize;j++){
printf("i= %d j=%d,ans=%d\n",nums[i],nums[j],nums[i]+nums[j]);
if(nums[i]+nums[j]==target){
arr[0]=i; arr[1]=j;
}
}
}
return arr;
}
在上面代码的 if statement
中添加大括号后会产生以下输出output image
但是如果我删除了 if statement
的大括号,那么我会得到一个不同的输出,如图所示 bracket of if statement removed
没有大括号,只有 if
(arr[0]=i
) 之后的第一条语句被执行。而如果 if
的大括号存在,则执行大括号内的所有语句。
C 在缩进方面不像 Python(可能还有其他一些语言),并且编译器不会解释您的两个 separate 语句在 if (...)
作为条件块的主体之后。所以,没有花括号,只有第一个语句(arr[0]=i;
)构成了条件块,第二个语句(arr[1]=j;
)不管结果如何都会被执行测试。
if
块的主体是 单个 语句或 'scope block' (有时称为 复合 语句),由 { ... }
大括号分隔。
在此 if 语句中不使用大括号
if(nums[i]+nums[j]==target){
arr[0]=i; arr[1]=j;
}
你实际上有
if(nums[i]+nums[j]==target) arr[0]=i;
arr[1]=j;
所以这个声明
arr[1]=j;
无条件执行。
例如,您可以使用一个带有逗号运算符表达式的语句,例如
if(nums[i]+nums[j]==target)
arr[0]=i, arr[1]=j;
得到预期的结果。
注意你的方法效率低下。一旦找到所需的数组元素对,嵌套循环应立即停止迭代。
这个参数
int* returnSize
没有意义,因为此指针指向的对象始终设置为 2。
动态分配内存不是一个好主意。
另外你没有初始化分配的内存。因此,如果未找到所需的数组元素对,您将返回一个具有不确定值的数组。
我将按照以下演示程序中所示的方式声明和定义函数。
#include <stdio.h>
struct Pair
{
size_t first;
size_t second;
};
struct Pair twoSum( const int *nums, size_t numsSize, int target )
{
struct Pair pair = { .first = numsSize, .second = numsSize };
int found = 0;
for ( size_t i = 0; !found && i < numsSize; i++ )
{
for ( size_t j = i + 1; !found && j < numsSize; j++ )
{
if ( nums[i] + nums[j] == target )
{
found = 1;
pair.first = i;
pair.second = j;
}
}
}
return pair;
}
int main( void )
{
int a1[] = { 2, 7, 11,15 };
size_t n = sizeof( a1 ) / sizeof( *a1 );
int target = 9;
struct Pair pair = twoSum( a1, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
int a2[] = { 3, 2, 4 };
n = sizeof( a2 ) / sizeof( *a2 );
target = 6;
pair = twoSum( a2, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
int a3[] = { 3, 3 };
n = sizeof( a3 ) / sizeof( *a3 );
target = 6;
pair = twoSum( a3, n, target );
if ( pair.first != n )
{
printf( "[%zu,%zu]\n", pair.first, pair.second );
}
return 0;
}
程序输出为
[0,1]
[1,2]
[0,1]